2012-12-06 6 views
0

현재 정규식으로 약간 놀고있어 광산 사이트의 텍스트에 맞춤 태그를 구현하고 싶습니다. tiger.jpg 폭 : 120 높이 : 200 나는 텍스트에 그림을 구현하려는 경우 예를 들어, 나는 다음과 같은 브라켓 태그를 사용 preg_match_all : 맞춤 태그 일치

로렘 입숨 슬픔

는 AMET (이미지 앉아 ... 이렇게하려면 제목 :이 그림은 호랑이를 보여줍니다) 나오지 DIAM nonumy eirmod tempor invidunt

이제

I 1. 내 PHP 스크립트는이 브라켓 태그를 찾아서 (2)이 괄호 안에 하나의 태그를 읽고 싶은, 그래서 다음과 같은 배열을 얻으십시오.

$attributes = array(
    'image' => 'tiger.jpg', 
    'width' => '150', 
    'height' => '250', 
    'title' => 'This picture shows a tiger', 
); 

(나에게) 까다로운 부분은 (\w+)\:과 같은 값을 포함하지 않는 "값"에 모든 태그가 포함될 수 있다는 것입니다. 이는 다른 태그의 시작이기 때문입니다. 다음 스 니펫은 지금까지 괄호를 찾았지만 지금까지는 작동하지만 하나의 태그로 브래킷 내용을 분리하는 것은 실제로 작동하지 않습니다. 그냥 자리 표시 자와 마찬가지로 값을 일치시키기 위해 (\w+)을 사용했습니다.이 값은 "tiger.jpg"또는 "This picture is tiger"또는 다른 것과 일치하지 않습니다. 내 말 뜻을 이해하길 바래! ;)

<?php 

$text = 'Lorem ipsum dolor sit amet (image: tiger.jpg width: 150 height: 250 title: This picture shows a tiger) sed diam nonumy eirmod tempor invidunt'; 

// find all tag-groups in brackets 
preg_match_all('/\((.*)\)/s', $text, $matches); 

// found tags? 
if(!empty($matches[0])) { 

    // loop through the tags 
    foreach($matches[0] as $key => $val) { 

     $search = $matches[0][$key]; // this will be replaced later 
     $cache = $matches[1][$key]; // this is the tag without brackets 

     preg_match_all('/(\w+)\: (\w+)/s', $cache, $list); // find tags in the tag-group (i.e. image, width, …) 

     echo '<pre>'.print_r($list, true).'</pre>'; 

    } 

} 

?> 

사람이 밖으로 나를 도울 수 있다면 좋을 것! 감사! :)

+1

처음부터이 작업을 수행하는 대신 템플릿 라이브러리를 사용할 수 없습니까? – Barmar

+0

확실히 할 수는 있겠지만 템플릿 라이브러리는 그 단순한 일에 정말로 필요하지 않은 함수의 과도한 총량이 될 것이므로 직접 할 수도 있습니다! ;) –

+0

꽤 가벼운 템플릿 라이브러리가 있습니다. 그리고 이런 종류의 가장 큰 문제 중 하나는 보안입니다. 템플릿 시스템을 롤링하면 XSS 취약점이 발생할 가능성이 매우 큽니다. – SDC

답변

0
<? 

$text = 'Lorem ipsum dolor sit amet (image: tiger.jpg width: 150 height: 250 title: This picture shows a tiger) sed diam nonumy eirmod tempor invidunt'; 

// find all tag-groups in brackets 
preg_match_all('/\(([^\)]+)\)/s', $text, $matches); 
$attributes = array(); 

// found tags? 
if ($matches[0]) { 
    $m = preg_split('/\s*(\w+)\:\s+/', $matches[1][0], -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 
    for ($i = 0; $i < count($m); $i+=2) $attributes[$m[$i]] = $m[$i + 1]; 
} 

var_export($attributes); 

/* 
array (
    'image' => 'tiger.jpg', 
    'width' => '150', 
    'height' => '250', 
    'title' => 'This picture shows a tiger', 
) 
*/