2014-11-04 2 views
0

Я работаю над скриптом php для пользовательских cms, которые заменят пользовательский тег информацией из базы данных.Regex выполняет все совпадения вместо возврата отдельно

Там будет тег, как показано ниже

<!-- NAV id="123" suffix="somethinghere" prefix="somethingelse" --> 

мне нужно вытащить атрибуты ID, суффикс и префикс. Код ниже отлично работает, если на странице есть только один экземпляр этого тега, но если у меня более одного, или если «->» находится где-нибудь еще на странице, он не работает должным образом. Он соответствует всем между первым

"<!--" 

и последний

"-->" 

вместо возвращения каждый матч отдельно.

Вот мой текущий код. Если он работает правильно, он заменит весь тег значением «id», в конечном итоге это будут данные из базы данных.

<?php 
global $lastNav, $html; 

//the html content 
$html = '<html><body><hr><br>Hi this is my content<br> <!-- NAV id="123" suffix="<br />" prefix="&bull;" --> <br>Some more content here <!-- NAV id="125" suffix="<br />" prefix="&bull;" -->  </body></html>'; 

$regexNavPattern = '<!-- NAV.*?(?:(?:\s+(id)="([^"]+)")|(?:\s+(prefix)="([^"]+)")|(?:\s+(suffix)="([^"]+)")|(?:\s+[^\s]+))+.*-->'; 

preg_replace_callback($regexNavPattern, "parseNav", $html); 
function parseNav($navData) { 
    global $lastNav, $html; 

    foreach($navData as $key=>$value) { 
     if($key == 0) { $lastNav['replace'] = '<'.$value.'>'; } 
     if($value == 'id')  { $lastNav['id']  = $navData[$key+1]; } 
     if($value == 'prefix') { $lastNav['prefix'] = $navData[$key+1]; } 
     if($value == 'suffix') { $lastNav['suffix'] = $navData[$key+1]; } 
    } 

    $html = str_replace($lastNav['replace'], $lastNav['id'], $html); 
} 

echo $html; 
?> 

На данный момент меня не интересует чувствительность к регистру. Существует вероятность того, что атрибуты могут содержать специальные символы, включая одиночные или двойные кавычки.

Надеюсь, я объяснил это достаточно хорошо. Заранее спасибо.

+0

Ваш '. *' В конце должен быть изменен на не жадный, как '. *?'. –

+0

У меня изначально был знак вопроса в конце, и у меня все еще такая же проблема. Кажется, это не имеет никакого влияния. Это было мое оригинальное выражение

+0

Обязательно: [Regex - неправильный инструмент для разбора html] (http://stackoverflow.com/a/1732454/52598) –

ответ

0

Решения Джонатана Куна работали. На данный момент я пошел с первым подходом только исправления существующего регулярного выражения.

/<!-- NAV.*?(?:(?:\s+(id)="([^"]+)")|(?:\s+(prefix)="([^"]+)")|(?:\s+(suffix)="([^"]+)‌​")|(?:\s+[^\s]?+))+.*?-->/ 

Позже я изменю его, чтобы разбить его, чтобы работать как несколько функций. Я ценю помощь.

Смежные вопросы