我要做的是:
$oneline="[a]http://first.com/hi_underscoredot.htm[/a] [a]http://secondinoneline.com/hi_.htm[/a]";
$changeToHTML=preg_replace("/\[a\](.*)\[\/a\]/","<a href='$1'>$1</a>",$oneline);
预期的输出是
echo $changeToHTML;
OUTPUT >> http://first.com/hi_underscoredot.htm http://secondinoneline.com/hi_.htm
但真正的输出是(这不是预期的):
echo $changeToHTML;
OUTPUT >> http://first.com/hi_underscoredot.htm[/a][a]http://secondinoneline.com/hi_.htm
正如您可以看到本文正上方的最后一个输出,您可以看到[/ a] [a]未被替换,并且链接变为ONE LINK。我不想要那个。
我希望他们分开作为两个链接?
如何?
任何人都可以帮助我?
p / s:这是一行。
答案 0 :(得分:2)
您的问题是.*
,而不是像[^\[]*
$changeToHTML=preg_replace("/\[a\]([^\[]*)\[\/a\]/","<a href='$1'>$1</a>",$oneline);
答案 1 :(得分:2)
比已经给出的更简单的解决方案:
$changeToHTML=preg_replace("/\[a\](.*?)\[\/a\]/","<a href='$1'>$1</a>",$oneline);
工作正常。
组合*?
表示:在零和无限时间之间,尽可能少地根据需要进行扩展[懒惰]。另请参阅this有用的网站以在线检查您的正则表达式。
答案 2 :(得分:1)
(。*)目前正在尽可能多地匹配,这是它的默认行为。您只希望它匹配,直到找到分隔符,仅此而已。为此,您可以使用U修饰符反转PCRE引擎的贪婪程度,如下所示:
$changeToHTML=preg_replace("/\[a\](.*)\[\/a\]/U","<a href='$1'>$1</a>",$oneline);
有关详情,请参阅此页:http://php.net/manual/en/reference.pcre.pattern.modifiers.php
答案 3 :(得分:1)
请改用:
(\[a\])([^\[]+)(\[\/a\])
具有替换模式
<a href='$2'>$2</a>
$re = '/(\[a\])([^\[]+)(\[\/a\])/';
$str = "[a]http://first.com/hi_underscoredot.htm[/a] [a]http://secondinoneline.com/hi_.htm[/a]";
$subst = "<a href='$2'>$2</a>";
$result = preg_replace($re, $subst, $str);
/* Prints:
<a href='http://first.com/hi_underscoredot.htm'>http://first.com/hi_underscoredot.htm</a> <a href='http://secondinoneline.com/hi_.htm'>http://secondinoneline.com/hi_.htm</a>
*/