多个正则表达式干扰

时间:2010-08-09 16:58:45

标签: php regex preg-replace

我使用正则表达式以纯文本格式创建html标签。像这样

$SearchArray[] = "/\b(".preg_quote($user['name'], "/").")\b/i"; 
$ReplaceArray[] = '<a href="'.$user['url'].'">$1</a>';

-

$str = preg_replace($SearchArray, $ReplaceArray, $str);

我正在寻找一种方法来匹配标记中的$user['name']

3 个答案:

答案 0 :(得分:3)

您可以使用preg_replace_callback()

for 5.3 +:

$callback = function($match) using ($user) {
    return '<a href="'.$user['url'].'">'.$match[1].'</a>';
};
$regex = "/\b(".preg_quote($user['name'], "/").")\b/i"; 
$str = preg_replace_callback($regex, $callback, $string);

for 5.2 +:

$method = 'return \'<a href="'.$user['url'].'">\'.$match[1].\'</a>\';';
$callback = create_function('$match', $method);
$regex = "/\b(".preg_quote($user['name'], "/").")\b/i"; 
$str = preg_replace_callback($regex, $callback, $string);

答案 1 :(得分:1)

所以问题是你在文档上做了几次传递,在每次传递中替换了不同的用户名,你担心你会无意中替换在前一次传递中创建的标记内的名称,正确?

我会尝试在一个传递中执行所有替换,使用preg_replace_callback作为@ircmaxwell建议,一个正则表达式可以匹配任何合法用户名称。在回调函数中,您查找匹配的字符串以查看它是否是真实用户的名称。如果是,则返回生成的链接;如果没有,则返回匹配的字符串以进行重新插入。

答案 2 :(得分:0)

看起来你正试图在文档中添加一堆锚点。你有没有想过使用SimpleXML。这假设锚标签是更大的xhtml文档的一部分。

//$xhtml_doc is some xhtml doc's path
$doc = simplexml_load_file($xhtml);
//NOTE: find the parent element for all these anchors (maybe with xpath)
//example: $parent = $doc->xpath('//div[@id=parent]');
foreach($user as $k => $v){
    $anchor = $doc->addChild('a', $v['name']);
    $anchor->addAttribute('href', $v['url']);
}
return $doc->asXML();

simpleXML在这些情况下对我有很大的帮助。它会比正则表达式快得多,即使这不是你想做的事情。