2015-01-09 1 views
0

[l] ... [/ l]이 (가) 내부 및 [li] 링크로 대체되도록 링크, 색상 및 글 머리 기호에 대한 맞춤 태그를 수행하려고합니다 ... [/ li]은 (는) 글 머리 기호 목록으로 바뀝니다.PHP를 반복 태그를 통해 반복하기

나는 그것이 절반 작업있어하지만 문제는, 링크 설명과 함께을 heres 코드가있다 :

[l]http://www.example1.com[/l] 
[l]http://www.example2.com[/l] 
[l]http://www.example3.com[/l] 
: 나는 세 개의 링크가있을 때

// Takes in a paragraph, replaces all square-bracket tags with HTML tags. Calls the getBetweenTags() method to get the text between the square tags 
function replaceTags($text) 
{ 
    $tags = array("[l]", "[/l]", "[list]", "[/list]", "[li]", "[/li]"); 
    $html = array("<a style='text-decoration:underline;' class='common_link' href='", "'>" . getBetweenTags("[l]", "[/l]", $text) . "</a>", "<ul>", "</ul>", "<li>", "</li>"); 

    return str_replace($tags, $html, $text); 
} 

// Tages in the start and end tag along with the paragraph, returns the text between the two tags. 
function getBetweenTags($tag1, $tag2, $text) 
{ 
    $startsAt = strpos($text, $tag1) + strlen($tag1); 
    $endsAt = strpos($text, $tag2, $startsAt); 

    return substr($text, $startsAt, $endsAt - $startsAt); 
} 

나는 데 문제가 그들은 모두 제대로 즉 1,2,3 하이퍼 링크되어

http://www.example1.com 
http://www.example1.com 
http://www.example1.com 

하지만 텍스트 BI :

링크는 다음과 같이 대체 취득 t는 모든 링크에서 동일합니다. 페이지 하단의 임의의 링크가 세 개인 동작 here에서 확인할 수 있습니다. 각 링크 아래에 올바른 URL 설명이 표시되도록 코드를 변경하면 각 링크가 해당 페이지에 해당 하이퍼 링크로 연결되어 해당 URL을 나타내는 해당 텍스트가 표시됩니다.

+1

기능을 요청할 때마다 매개 변수가 변경되는지 확인하십시오. – Neat

+0

내가 무슨 일이 일어나는 것 같아요 3 개의 링크를 포함하는 전체 단락을 부여, 각 태그를 올바르게 바꾸지 만 getBetweenTags() 태그를 한 번 호출 한 다음 해당 설명을 세 개의 링크 각각에 넣는 것입니다 - 어떻게 코드를 getBetweenTags() 새 사각형 태그 집합을 발견 할 때마다? – Crizly

답변

0

str_replace 당신을 위해 모든 일은 씁니다. 문제는 다음과 같습니다.

getBetweenTags("[l]", "[/l]", $text) 

변경되지 않습니다. 3 번 일치하지만으로 끝나기 때문에 페이지의 첫 번째 링크입니다.

정적 대체를 실제로 수행 할 수 없으며 입력 텍스트의 위치에 대한 포인터를 최소한 유지해야합니다.

간단한 토크 나이저/파서를 작성하는 것이 좋습니다. 실제로 그렇게 어렵지는 않습니다. 토크 나이저는 정말 간단 할 수 있습니다. 모두 []을 찾고 태그를 파생시킵니다. 그런 다음 파서가 토큰을 이해하려고합니다. 토큰 스트림은 다음과 같습니다.

array(
    array("string", "foo "), 
    array("tag", "l"), 
    array("string", "http://example"), 
    array("endtag", "l"), 
    array("string", " bar") 
); 
0

다음은 개인적으로 preg_match_all을 사용하는 방법입니다.

$str=' 
[l]http://www.example1.com[/l] 
[l]http://www.example2.com[/l] 
[l]http://www.example3.com[/l] 
'; 
preg_match_all('/\[(l|li|list)\](.+?)(\[\/\1\])/is',$str,$m); 
if(isset($m[0][0])){ 
    for($x=0;$x<count($m[0]);$x++){ 
     $str=str_replace($m[0][$x],$m[2][$x],$str); 
    } 
} 
print_r($str);