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
改用这个:
(\[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 有用的网站以在线检查您的正则表达式。
我要做的是:
$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
改用这个:
(\[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 有用的网站以在线检查您的正则表达式。