Проверка шаблона как можно больше

0

Как сделать preg найти все возможные решения для шаблона регулярных выражений?

Здесь код:

<?php

$text = 'Amazing analyzing.';
$regexp = '/(^|\\b)([\\S]*)(a)([\\S]*)(\\b|$)/ui';
$matches = array();

if (preg_match_all($regexp, $text, $matches, PREG_SET_ORDER)) {
    foreach ($matches as $match) {
        echo "{$match[2]}[{$match[3]}]{$match[4]}\n";
    }
}

?>

Вывод:

Am[a]zing
an[a]lyzing.

Результат, который мне нужен:

[A]mazing
Am[a]zing
[A]nalyzing.
an[a]lyzing.
  • 0
    читать о не жадном сопоставлении
  • 0
    Вы не можете получить результат, как вы ожидали, потому что один матч включен в другой. Используйте утверждения lookahead и lookbehind, но в php, look-behind не позволяет использовать квантификаторы внутри этого.
Теги:

2 ответа

0

Утверждения Lookaround не помогут по двум причинам:

  • Поскольку они имеют нулевую длину, они не будут возвращать символы, которые вам нужны.
  • Как заметил Авинаш Радж, PHP lookbehind не позволяет *.

Это дает требуемый результат:

<?php

$text = 'Amazing analyzing.';

foreach (preg_split('/\s+/', $text) as $word)
{
    $matches = preg_split('/(a)/i', $word, 0, PREG_SPLIT_DELIM_CAPTURE);
    for ($match = 1; $match < count($matches); $match += 2)
    {
        $prefix = join(array_slice($matches, 0, $match));
        $suffix = join(array_slice($matches, $match+1));
        echo "{$prefix}[{$matches[$match]}]{$suffix}\n";
    }
}

?>
0

Вы должны использовать look for/forward утверждения нулевой длины (вместо обычного шаблона, который потребляет персонажей вокруг того, что вы ищете): http://www.regular-expressions.info/lookaround.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню