2010-08-09 6 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

+0

Вы могли бы ... Производительность может быть проблемой (вам может быть лучше с 'str_ireplace()', но вы не сможете сохранить регистр имени) ... – ircmaxell

+0

У меня все еще есть проблемы с получением рабочий цикл в php 5.2. ошибка представляет собой «синтаксическую ошибку, неожиданную» <'in on runtime-created function ". Регулярные $ method и $ regex разные. Coud you gif мне пример вашего кода внутри цикла? – Remi

1

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

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

+0

Исправить. Не могли бы вы показать мне пример? Я использую php 5.2 – Remi

+0

Каковы ограничения на имена пользователей? Какие персонажи являются законными? Требуется ли минимальная или максимальная длина? Есть ли еще одно ограничение для первого персонажа? Например, должно ли имя начинаться с буквы? Нам нужна эта информация для создания регулярного выражения. –

+0

regex "/\b(".preg_quote($user['name ']," /").")\b/i "работает для меня скорость не важна. Есть и другое слово, которое я хочу совместить с собственным регулярным выражением. – Remi

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