2010-08-09 79 views
2

我使用正则表达式来创建纯文本的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

你可以使用preg_replace_callback()

为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); 

为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); 
+0

我从来没有在php中使用这种回调。我使用的是PHP 5.2 ..我可以把这段代码放在循环中循环200次吗? – Remi 2010-08-09 18:00:25

+0

你可能...性能可能是一个问题(你可能会更好''str_ireplace()',但你将无法保留名称的情况下)... – ircmaxell 2010-08-09 18:34:02

+0

我仍然有问题得到一个工作循环在PHP 5.2中。错误是“运行时创建的函数中出现”语法错误,意外“<”。 $方法和$正则表达式每次都是不同的。你给我一个循环内代码的例子吗? – Remi 2010-08-16 08:29:06

1

所以问题是,你在资料制作几经,更换每次传递中都有一个不同的用户名,而且您担心会无意中替换之前传球中创建的标签中的名称,对吗?

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

+0

正确。 你能告诉我一个例子吗?我使用的是PHP 5.2 – Remi 2010-08-16 09:03:47

+0

用户名有什么限制?哪些角色合法?是否有最小或最大长度要求?对第一个字符是否有进一步的限制?例如,名称是否必须以字母开头?我们需要这些信息才能创建正则表达式。 – 2010-08-16 12:12:29

+0

正则表达式“/\b(".preg_quote($user['name'],”/").")\b/i“对我来说速度并不重要。还有其他的词我想与自己的正则表达式匹配。 – Remi 2010-08-16 13:07:31

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在这些情况下帮助我很多。它会比正则表达式快很多,即使这不正是你想要做的。