Я работаю над скриптом 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="•" --> <br>Some more content here <!-- NAV id="125" suffix="<br />" prefix="•" --> </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;
?>
На данный момент меня не интересует чувствительность к регистру. Существует вероятность того, что атрибуты могут содержать специальные символы, включая одиночные или двойные кавычки.
Надеюсь, я объяснил это достаточно хорошо. Заранее спасибо.
Ваш '. *' В конце должен быть изменен на не жадный, как '. *?'. –
У меня изначально был знак вопроса в конце, и у меня все еще такая же проблема. Кажется, это не имеет никакого влияния. Это было мое оригинальное выражение –
Обязательно: [Regex - неправильный инструмент для разбора html] (http://stackoverflow.com/a/1732454/52598) –