preg_replace 一行多项

preg_replace multi item in one line

我要做的是:

$oneline="[a]http://first.com/hi_underscoredot.htm[/a] [a]http://secondinoneline.com/hi_.htm[/a]";

$changeToHTML=preg_replace("/\[a\](.*)\[\/a\]/","<a href=''></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] 没有被替换并且 link 变成了一个 LINK。我不想要那个。

我想把它们分开成两个 LINKS?

如何?

有人可以帮助我吗?

p/s:这是一行。

你的问题是 .*,而不是写 [^\[]*

$changeToHTML=preg_replace("/\[a\]([^\[]*)\[\/a\]/","<a href=''></a>",$oneline);

(.*) 当前正在尽可能匹配,这是它的默认行为。您希望它只匹配直到找到定界符,仅此而已。为此,您可以像这样使用 U 修饰符反转 PCRE 引擎的贪婪度:

$changeToHTML=preg_replace("/\[a\](.*)\[\/a\]/U","<a href=''></a>",$oneline);

有关详细信息,请参阅此页面:http://php.net/manual/en/reference.pcre.pattern.modifiers.php

改用这个:

Regex101 Demo

(\[a\])([^\[]+)(\[\/a\])

替换模式为

<a href=''></a>

$re = '/(\[a\])([^\[]+)(\[\/a\])/'; 
$str = "[a]http://first.com/hi_underscoredot.htm[/a] [a]http://secondinoneline.com/hi_.htm[/a]"; 
$subst = "<a href=''></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>
*/

一个比已经给出的更简单的修复:

$changeToHTML=preg_replace("/\[a\](.*?)\[\/a\]/","<a href=''></a>",$oneline);

工作正常。

组合*?的意思是:零次到无限次之间,次数越少越好,按需扩充[懒惰]。另请参阅 this 有用的网站以在线检查您的正则表达式。