preg_replace在另一个preg_replace的匹配上

时间:2010-09-08 20:05:15

标签: php regex

我有一种感觉,我可能会遗漏一些非常基本的东西。不管怎样,还有下面的情景:

我正在使用preg_replace将===inputA===inputB===转换为<a href="inputB">inputA</a>
这就是我正在使用的

$new = preg_replace('/===(.*?)===(.*?)===/', '<a href="$2">$1</a>', $old);

它的工作正常,但我还需要进一步限制inputB,所以就像这样

preg_replace('/[^\w]/', '', every Link or inputB);

所以基本上,在第一段代码中,您在那里看到$2,我需要对该$2执行操作,以便它只包含\w,如您在第二段中所见码。所以最终的结果应该是这样的:
===The link===link's page===转换为<a href="linkspage">The link</a>

我不知道该怎么做,我该怎么办?

3 个答案:

答案 0 :(得分:2)

虽然已经有一个已接受的答案:这是/e修饰符或preg_replace_callback()的用途:

echo preg_replace(
    '/===(.*?)===(.*?)===/e',
    '"<a href=\"".preg_replace("/[^\w]/","","$2")."\">$1</a>"',
    '===inputA===in^^putB===');

//Output: <a href="inputB">inputA</a>

或者:

function _my_url_func($vars){
   return '<a href="'.strtoupper($vars[1]).'">'.$vars[2].'</a>';
}

echo preg_replace_callback(
    '/===(.*?)===(.*?)===/',
    '_my_url_func',
    '===inputA===inputB===');

//Output: <a href="INPUTA">inputB</a>

答案 1 :(得分:1)

在第一个上尝试preg_match以将2个匹配项变为变量,然后对要进一步检查的变量使用preg_replace()?

答案 2 :(得分:1)

为什么不从第一个正则表达式(preg_match)中提取匹配项并处理结果,然后将它们放回HTML表单中?