我想用PHP来转换这种格式的文本:
foo [[http://www.google.com|This Link points to google]] foo
到这个
foo <a href="http://www.google.com">This Link points to google</a> foo
我已经制作了这段代码:
function linkLine($line) {
if (preg_match('#\[\[(.*?)\]\]#', $line, $match)) {
$arr = explode("|", $match[1], 2);
$link = "<a href=\"$arr[0]\">$arr[1]</a>";
return str_replace($match[0], $link, $line);
} else {
return $line;
}
}
但我知道这不优雅,不健壮,如果在同一行中出现多次,则不起作用。
如何使用preg_replace
改善它?
答案 0 :(得分:1)
您可以将同一个正则表达式与preg_replace_callback
:
$re = '/\[\[(.*?)]]/';
$str = 'foo [[http://www.google.com|This Link points to google]] foo [[http://www.more.com|This Link points to more]]';
echo preg_replace_callback($re, function($m) {
$arr = explode("|", $m[1], 2);
return '<a href="' . $arr[0] . '">'. $arr[1] . '</a>';
}, $str);
请参阅PHP demo。
结果:
foo <a href="http://www.google.com">This Link points to google</a> foo <a href="http://www.more.com">This Link points to more</a>
如果[[
和]]
中的字符串不能包含[
,]
并且只有1 |
,那么您也可以使用
$re = '/\[\[([^][|]*?)\|([^][]*?)]]/';
请参阅以下PHP demo:
$re = '/\[\[([^][|]*?)\|([^][]*?)]]/';
$str = 'foo [[http://www.google.com|This Link points to google]] foo [[http://www.more.com|This Link points to more]]';
echo preg_replace($re, '<a href="$1">$2</a>', $str);
答案 1 :(得分:0)
就个人而言,我认为&#39;风格&#39;在使用正则表达式进行文本操作时,优先级列表中的优先级较低。在我看来,在该列表中更高的是首要的功能:它是否有效?大。其次是可读性:其他人可以理解它在做什么,如果有错误/错误,他们可以轻松解决吗?
也就是说,你改进它的动机是有效的,因为它没有达到你的一个功能要求,也就是说,如果在同一行中有多次出现。
那么为什么不一步一步地解决这个问题:
1)替换第一次出现的&#39; [[&#39;用&#39;
2)替换第一次出现的&#39; |&#39;在&#39; [[&#39;与&#39;&#34;&gt;&#39;。
(这是一个棘手的问题,因为它需要您做出决定。对于以下示例,您更喜欢哪两种结果?:
3)foo [[http://www.google.com|This链接指向]] google]] foo
我将第一次使用&#39;]]&#39;。如果您想捕获外部括号,那么您需要使用前瞻来检查以确保不再有&#39;]]&#39;之前&#39; [[&#39;。
按照上述步骤,我想出了(在javascript中,所以我可以展示一个例子):
let regex = /(.*)(\s\[\[)(http:\/\/[^|]+)(\|)((.*)(?=\b)(\]\]\s))(.*)/;
let result = "foo [[http://www.google.com|This Link points to google]] foo".replace(regex,'$1 <a href="$3"/>$6</a> $8');
let pathologicalDataResult = "foo [[http://ww[[w.google.co|m|This Link poi]]nts to google]] foo".replace(regex,'$1 <a href="$3"/>$6</a> $8');
console.log(result);
console.log(pathologicalDataResult);
&#13;