我试图为网站上的链接,颜色和项目符号做自定义标记,以便[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?
答案 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);