PHP通过替换标签循环

时间:2015-01-09 13:29:22

标签: php html

我试图为网站上的链接,颜色和项目符号做自定义标记,以便[l] ... [/ l]被内部链接替换为[li] ... [/ li ]被子弹点列表取代。

我已经完成了一半的工作,但链接描述存在问题,代码是:

// 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);
}

我遇到的问题是当我有三个链接时:

[l]http://www.example1.com[/l]
[l]http://www.example2.com[/l]
[l]http://www.example3.com[/l]

链接被替换为:

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

它们都是正确的超链接,即1,2,3,但所有链接的文本位都相同。 您可以在页面底部的操作here中看到它,其中包含三个随机链接。如何更改代码以在每个链接下显示正确的URL描述 - 因此每个链接都正确地超链接到相应的页面,相应的文本显示该URL?

2 个答案:

答案 0 :(得分:0)

str_replace为你做了所有的琐事。问题是:

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

不会改变。它将匹配3次,但它只会解析为"http://www.example1.com",因为它是页面上的第一个链接。

您无法真正进行静态替换,您需要至少保留指向输入文本中的位置的指针。

我的建议是编写一个简单的标记器/解析器。实际上并不那么难。标记器可以非常简单,找到所有[]并派生标签。然后你的解析器将尝试理解令牌。您的令牌流可能如下所示:

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

答案 1 :(得分: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);