php的正则表达式解决方案

时间:2011-05-02 17:20:28

标签: php regex

我试图自己解决这个问题(甚至买了一本Kindle电子书!),但我正在努力解决PHP中的反馈问题。

我想要的是以下示例:

var $html = "hello %world|/worldlink/% again";

output:
hello <a href="/worldlink/">world</a> again

我试过像:

preg_replace('/%([a-z]+)|([a-z]+)%/', '<a href="\2">\1</a>', $html);

但没有快乐。

有什么想法吗?我相信有人会发布确切的答案,但我也想解释一下 - 所以我不必一直问这些问题:)

7 个答案:

答案 0 :(得分:1)

斜杠“/”不包含在您允许的范围[a-z]中。而是使用

preg_replace('/%([a-z]+)\|([a-z\/]+)%/', '<a href="\2">\1</a>', $html);

答案 1 :(得分:1)

你的表达:

'/%([a-z]+)|([a-z]+)%/'

只捕捉一件事。中间的|表示“或”。你试图捕获它们,所以你不需要在那里使用OR。你想要一个文字|符号,所以你需要逃避它:

'/%([a-z]+)\|([a-z\/]+)%/'

/字符也需要包含在您的字符集中,并按上述方式进行转义。

答案 2 :(得分:1)

你的正则表达式(/%([a-z]+)|([a-z]+)%/)以这种方式读取:

  

匹配%后跟+(= 1或   更多)a-z个字符(存储此内容)   反向引用#1 )。

     

或(|):

     

匹配+(=一个或多个)a-z   字符(并将其存储到   反向引用#2 )后跟一个   %


您正在寻找的是:

preg_replace('~%([a-z]+)[|]([a-z/]+)%~', '<a href="$2">$1</a>', $html);

基本上我刚刚逃过了| regex meta character(你可以像我一样用[]围绕它,或者只是在前面加上一个向后的斜杠\,我个人找到前者更容易阅读,并在第二个捕获组中添加/

我还将delimiters/更改为~,因为如果您想继续使用/作为分隔符,则更不可能在字符串中出现代字号也必须逃避它们在你的正则表达式中的出现。

recommended您在替换后向引用中使用$语法而不是\

  

$replacement可能包含引用   形式\\n或(自PHP 4.0.4起)   $n,后者的形式是。{   首选。

答案 3 :(得分:0)

这对我有用:

preg_replace('/%([a-z]+)\|([a-z\/]+)%/', '<a href="\2">\1</a>', $html);

答案 4 :(得分:0)

这是一个根据提供的OP数据/信息工作的版本(使用非斜杠分隔符来避免转义斜杠):

preg_replace('#%([a-z]+)\|([a-z/]+)%#', '<a href="\2">\1</a>', $html);

使用非斜杠分隔符可以减少转义斜杠的需要。

输出:

hello <a href="/worldlink/">world</a> again

解释

为什么你的工作不起作用。首先,|OR运算符,在您的示例中,应该对其进行转义。第二,因为您正在使用/或期望斜杠,所以最好使用非斜杠分隔符,例如#。第三,需要将斜杠添加到允许的匹配列表中。如前所述,您可能希望包含更多选项,因为任何类型的单词都带有数字下划线句号连字符将失败/破坏脚本。希望这是您正在寻找的解释。

答案 5 :(得分:0)

您的正则表达式不会转义|,也不会包含该网址的正确字符。

这是一个基本的 live 示例,仅支持a-z和斜杠:

preg_replace('/%([a-z]+)\|([a-z\/]+)%/', '<a href="\2">\1</a>', $html);

实际上,您希望将这些[a-z]+块更改为更具表现力的块。对URL匹配的正则表达式进行一些搜索,然后选择一个符合你想要的表达式。

答案 6 :(得分:0)

$html = "hello %world|/worldlink/% again";

echo preg_replace('/([A-ZA-z_ ]*)%(.+)\|(.+)%([A-ZA-z_ ]*)/', '$1<a href="$3">$2</a>$4', $html);

output:
hello <a href="/worldlink/">world</a> again

这是一个有效的代码:http://www.ideone.com/0qhZ8