Присоединяйтесь к 3 регулярным выражениям в 1 - PullRequest
1 голос
/ 13 мая 2011

все.Не могли бы вы дать мне несколько советов о том, как я могу объединить следующие 3 регулярных выражения в 1?

preg_match_all('/>\s*([\w-]+)\s*</', $str, $matches_1);
preg_match_all('/<\?=\s*([\w-]+)\s*\?>/', $str, $matches_2);
preg_match_all('/echo\s*["|']+\s*([\w-]+)["|']+/', $str, $matches_3);

ОБНОВЛЕНИЕ

preg_match_all(
    '/
       >\s*([\w-]+)\s*<
       |
       <\?=\s*([\w-]+)\s*\?>
       |
       echo\s*("|')+\s*([\w-]+)("|')+
    /x',
    $str, $matches_123);

Для меня синтаксис вышеработает только если написано в одну строку и удален x-модификатор.По какой-то причине этого не происходит:

Предупреждение: preg_match_all () [function.preg-match-all]: ошибка компиляции: отсутствует) со смещением 125 в ...

I 'мы решили это, просто разделив регулярное выражение на 3 строки и объединив их, но это беспорядок.

Ответы [ 2 ]

1 голос
/ 13 мая 2011

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

/>\s*([\w-]+)\s*<|<\?=\s*([\w-]+)\s*\?>|echo\s*(?:"|')+\s*([\w-]+)(?:"|')+/
1 голос
/ 13 мая 2011

Объедините их в качестве альтернативы, используя |

preg_match_all(
    '/
       >\s*([\w-]+)\s*<
       |
       <\?=\s*([\w-]+)\s*\?>
       |
       echo\s*("|&\#039;)+\s*([\w-]+)("|&\#039;)+
    /x',
    $str, $matches_123);

Возможно, вы захотите заключить каждую часть в ( parens ), чтобы разделить их в списке результатов.Но тогда другим подвыражениям может потребоваться префикс ?:.Кроме того, альтернативы ["|'] были недействительными (квадратные скобки не работают таким образом, могут работать случайно, но не являются надежным соответствием).

...