Как «преобразовать» любое заданное регулярное выражение в регулярное выражение, совместимое с PHP `preg_match`? - PullRequest
0 голосов
/ 04 декабря 2010

Хорошо, это может быть глупый вопрос, но я довольно плохо знаком с регулярными выражениями и, честно говоря, понятия не имею, как это сделать.

Я не знаю, как определить, будет ли регулярное выражение работать с PHP preg_match() или нет.

Например, я хотел бы использовать следующее регулярное выражение с PHP preg_match().

\b
# Match the leading part (proto://hostname, or just hostname)
(
    # ftp://, http://, or https:// leading part
    (ftp|https?)://[-\w]+(\.\w[-\w]*)+
  |
    # or, try to find a hostname with our more specific sub-expression
    (?i: [a-z0-9] (?:[-a-z0-9]*[a-z0-9])? \. )+ # sub domains
    # Now ending .com, etc. For these, require lowercase
    (?-i: com\b
        | edu\b
        | biz\b
        | gov\b
        | in(?:t|fo)\b # .int or .info
        | mil\b
        | net\b
        | org\b
        | [a-z][a-z]\b # two-letter country codes
    )
)

# Allow an optional port number
( : \d+ )?

# The rest of the URL is optional, and begins with / . . . 
(
     /
     # The rest are heuristics for what seems to work well
     [^.!,?;"'<>()\[\]{}\s\x7F-\xFF]*
     (?:
        [.!,?]+  [^.!,?;"'<>()\[\]{}\s\x7F-\xFF]+
     )*
)?

preg_match($regex, $url); не работает, если приведенное выше регулярное выражение используется как есть. Почему бы и нет? Какие шаги нужно предпринять, чтобы «преобразовать» его, чтобы он работал?

Обратите внимание, что приведенное здесь регулярное выражение является лишь примером; Я хотел бы узнать, как преобразовать любое регулярное выражение в preg_match -совместимый эквивалент.

Заранее спасибо!

P.S. Я спрашиваю, потому что собираю и сравниваю различные регулярные выражения URL на этой тестовой странице: http://mathiasbynens.be/demo/url-regex Люди продолжают отправлять мне регулярные выражения на других языках, и я не знаю, как заставить их работать: (

Ответы [ 3 ]

5 голосов
/ 04 декабря 2010

Вы можете использовать флаг модификатора x в PHP, чтобы разрешить использование пробелов и комментариев. Смотри http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

Также вам нужно обернуть регулярное выражение в набор разделителей . Итак, /regex/modifiers, вот так:

/[abc]/xi

… модификатор i предназначен для нечувствительности к регистру.

Я настоятельно рекомендую 3-е издание Мастеринг регулярных выражений (3-е издание включает целую главу по PHP, но вся книга очень поучительна!)

P.S. RegexBuddy (приложение Windows) может конвертировать регулярные выражения между языками для вас: http://cl.ly/050z3e1Z3e050M3W2u2a К сожалению, версии для Mac нет.

1 голос
/ 04 декабря 2010

К сожалению, я могу опубликовать только одну ссылку на ответ!?

http://www.php.net/manual/en/regexp.reference.delimiters.php

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

Я настоятельно рекомендую 3-е издание «Освоение регулярных выражений» (3-е издание включает целую главу по PHP, но вся книга очень поучительна!)

0 голосов
/ 05 декабря 2010

пожалуйста, прости меня за то, что я ушел от темы, но это регулярное выражение не включает все TLD. Например. в нем отсутствуют .museum и .aero

Всегда говорят о добавлении новых TLD или даже разрешении чего-либо в качестве TLD, поэтому я советую не использовать регулярное выражение, перечисляющее их.

...