вложенные регулярные выражения (обтекание тегами) - PullRequest
0 голосов
/ 28 августа 2011

Мне нужно сделать несколько (вложенных) текстовых замен (например, обернуть все найденные строки тегом SPAN для подсветки) кучей регулярных выражений, но ... см. Код:

<?php

// Sample workaround code:
$html = "hello world";

$regex_array = array(
    '/world/i',
    '/hello world/i'
);

foreach ( $regex_array as $regex ) {
    if ( preg_match_all($regex, $html, $matches) ) {
        foreach ( $matches[0] as $match ) {
            $html = str_replace($match, '<span>' . $match . '</span>', $html);
        }
    }
}

print '<h4>Result:</h4>' 
. htmlentities($html, ENT_QUOTES, 'utf-8');
print '<h4>Expected result:</h4>'
. htmlentities('<span>hello <span>world</span></span>', ENT_QUOTES, 'utf-8');

Результат:

hello <span>world</span>

но ожидаемый результат:

<span>hello <span>world</span></span>

Как я могу это сделать?

Да, я мог бы изменить порядок правил регулярных выражений, и это могло бы решить проблему, но я действительно НЕ МОГУ СДЕЛАТЬ ЭТО!

1 Ответ

2 голосов
/ 28 августа 2011

Вы должны использовать preg_replace_callback вместо preg_match_all + str_replace:

function handle_matches($matches) {
    return '<span>' . $matches[0] . '</span>';
}
foreach ( $regex_array as $regex ) {
    $html = preg_replace_callback($regex, 'handle_matches', $html);
}

Или с PHP5.3:

foreach ( $regex_array as $regex ) {
    $html = preg_replace_callback($regex, function($matches) {
        return '<span>' . $matches[0] . '</span>';
    }, $html);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...