preg_replace多行项目在一行

时间:2015-11-20 14:32:33

标签: php preg-replace line

我要做的是:

$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:这是一行。

4 个答案:

答案 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)

请改用:

Regex101 Demo

(\[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>
*/