Несколько регулярных выражений мешают - PullRequest
2 голосов
/ 09 августа 2010

Я использую регулярное выражение для создания 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 ]

3 голосов
/ 09 августа 2010

Вы можете использовать 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);
1 голос
/ 10 августа 2010

Таким образом, проблема в том, что вы делаете несколько проходов по документу, заменяя другое имя пользователя на каждом проходе, и вы боитесь, что вы непреднамеренно замените имя внутри тега, созданного в предыдущем проходе, право

Я бы попытался выполнить все замены за один проход, используя preg_replace_callback, как предложено @ircmaxwell, и один регулярное выражение, которое может соответствовать любому допустимому имени пользователя. В функции обратного вызова вы просматриваете совпавшую строку, чтобы увидеть, действительно ли это имя пользователя. Если это так, верните сгенерированную ссылку; если нет, верните соответствующую строку для повторной вставки.

0 голосов
/ 10 августа 2010

Похоже, вы пытаетесь добавить несколько якорей к документу. Задумывались ли вы об использовании 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 мне очень помогает в таких ситуациях. Это будет намного быстрее, чем регулярное выражение, даже если это не совсем то, что вы хотите сделать.

...