我使用正则表达式以纯文本格式创建html标签。像这样
环
$SearchArray[] = "/\b(".preg_quote($user['name'], "/").")\b/i";
$ReplaceArray[] = '<a href="'.$user['url'].'">$1</a>';
-
$str = preg_replace($SearchArray, $ReplaceArray, $str);
我正在寻找一种方法来匹配标记中的$user['name']
。
答案 0 :(得分:3)
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在这些情况下对我有很大的帮助。它会比正则表达式快得多,即使这不是你想做的事情。