Рішення (яке в інших відповідях не згадується - принаймні на момент написання цього матеріалу) полягає в тому, що коли PHP посилається на роздільники, це стосується не роздільників, які ви бачите у своєму коді (це лапки), а наступного символів усередині рядка. (Насправді я ніколи не бачив цього ніде в жодній документації: це потрібно бачити на прикладах.) Отже, замість того, щоб мати синтаксис регулярного виразу, подібний до того, до якого ви звикли з багатьох інших мов:
/something/
PHP використовує рядки, а потім шукає всередині рядка інший роздільник:
'/something/'
Розділювач, на який посилається PHP, - це пара /
символів, а не пара '
символів. Отже, якщо ви пишете 'something'
, PHP сприйме s
як передбачуваний роздільник і скаржиться, що вам заборонено використовувати буквено-цифрові символи як роздільник.
Отже, якщо ви хочете передати (наприклад) an, i
щоб показати, що ви хочете відповідати регістру, не враховуючи регістр, ви передаєте його всередині рядка, але поза роздільниками регулярних виразів:
'/something/i'
Якщо ви хочете використовувати щось інше, ніж /
як свій роздільник, ви можете, наприклад, якщо ви збігаєтеся з URL-адресою і не хочете, щоб уникнути всіх похилих рисок:
'~something~'
preg_match()
як змінні, переконайтесь, що ви не отримали порядок змінних, випадково змішаних у виклику функції, оскільки це також майже напевно призведе до того самого з'являється помилка.