Intereting Posts
Как предотвратить множественную отправку форм при нескольких кликах в PHP Можно ли загрузить фотографию в альбом fanpage без публикации? Как преобразовать строку чисел, разделенных запятыми, в массив целых чисел? Добавить значок доверия Google в Magento Как проверить, подключен ли пользователь к facebook? срок действия документа после нажатия кнопки возврата WordPress – правильная ссылка php для изображений в медиа-библиотеке Какая строка прерывается в заголовке php mail, \ r \ n или \ n? Есть ли способ получить количество записей из запроса с помощью Zend-framework? Обнаруживать, если на сервере установлено расширение PHP FreeType Разбиение страниц с помощью MySQLi PHP не распознает метод, определенный в классе Использование заголовка в PHP Вставьте несколько строк с тем же уникальным идентификатором Основная функция почты (PHP) дополнительный параметр параметра «-f»

Почему это регулярное выражение вернет ошибку?

Почему следующее оценивается как true ?

 if(preg_match_all('%<tr.*?>.*?<b>.*?</b>.*?</tr>%ims', $contents, $x)===FALSE) {...} 

$contents , извлекается с помощью file_get_contents() из этого источника .


Регулярное выражение было упрощено, чтобы решить проблему. Код, который я использовал, был:

 if(preg_match( '%Areas of Study: </P>.*?<TABLE BORDER="0">(.*?)<TBODY>.*?</TBODY>.*? </TABLE>%ims', $contents, $course_list) ) { if(preg_match_all('%<TR>.*?<TD.*?>.*?<B>(.*?)</B>.*?</TD>.*?<TD.*?>.*?</TD>.*?<TD.*?>.*?<B>(.*?)</B>.*?</TD>.*?</TR>%ims', $course_list[0], $course_titles) ) { ... } else { die('<p>ERROR: first preg_match_all fails</p>'); } echo '<p>INFO: Courses found</p>'; } else { die('<p>ERROR: Courses not found</p>'); } if( preg_match_all('%<tr.*?>.*?<b>.*?first '.$college.' area of study.*?</b>.*?</tr>.*?<tr.*?>.*?<td.*?>.*?<b>(.*?) \((.*?)\).*?</b>(.*?credits.*?)</td>.*?<td.*?>(.*?<a .*?)</td>.*?</tr>%ims', $contents, $course_modules)) { .... } else { die('<p>ERROR: Courses details/streams not found</p>'); } 

Я всегда получаю:

ИНФО: Курсы найдены
ОШИБКА: Детали курса / потоки не найдены

Странно, как работают другие вызовы функции регулярных выражений, но не последняя.


Заметка:

Это регулярное выражение ранее работало (это было фактически более сложным). Я не уверен, что это имеет значение, но я обновил мою версию WAMP (поэтому мой php.ini и т. Д. Был сброшен), и я перепутал с моей настройкой, а также устранил проблему с соединением MongoDB на прошлой неделе.

Related of "Почему это регулярное выражение вернет ошибку?"

Вы можете проверить свой параметр pcre.backtrack_limit . Это должно было бы быть смехотворно низким, чтобы это регулярное выражение не соответствовало этому вводу, но вы сказали, что вы возились с настройкой …

Вы можете попробовать протестировать его, изменив регулярное выражение. Когда я тестировал его в RegexBuddy, ваше регулярное выражение соответствовало этому вводу с шагом 1216. Когда я изменил это на это:

 '%<tr.*?>.*?<b>.*?</b>[^<]*(?:<(?!/?tr\b)[^<]*)*</tr>%ims' 

… это заняло всего 441 шаг.

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

Теперь, когда я видел ваши регулярные выражения в реальном мире, я должен сказать, что у вас есть другая проблема. Я проверил это третье регулярное выражение на странице, с которой вы связались в RegexBuddy, и это результаты, которые я получил:

 (?ims)<tr.*?>.*?<b>.*?first science area of study.*?</b>.*?</tr>.*?<tr.*?>.*?<td.*?>.*?<b>(.*?) \((.*?)\).*?</b>(.*?credits.*?)</td>.*?<td.*?>(.*?<a .*?)</td>.*?</tr> course name start end steps Match #1 (Comp. Sci.) 10 275 31271 Match #2 (Bio & Chem) 276 341 6986 Match #3 (Enviro) 342 379 5944 Match #4 (Genetics) 386 416 4463 Match #5 (Chem) 417 455 5074 Match #6 (Math) 495 546 15610 Match #7 (Phys & Astro) 547 593 8617 Match #8 (no match) gave up after 1,000,000 steps 

Вероятно, вы слышали, что многие люди говорят, что не-жадные регулярные выражения всегда возвращают самое короткое возможное совпадение, так почему этот первый возвращает первый матч, который на 200 строк длиннее любого другого? Возможно, вы слышали, что они более эффективны, потому что они не отступают так сильно, так почему же это заняло более 30 000 шагов, чтобы завершить первый матч, и почему он эффективно блокировал последнюю попытку, когда совпадение не было возможным ?

Во-первых, нет такой вещи, как жадное или не жадное регулярное выражение. Можно описать только отдельные кванторы. Регулярное выражение, в котором каждый квантор является жадным, не обязательно будет возвращать самое длинное совпадение, а имя «не-жадное регулярное выражение» еще менее точно. Жадный или не жадный, двигатель регулярного выражения всегда начинает пытаться соответствовать при первой возможности, и он не отказывается от исходной позиции, пока не будет изучен все возможные пути от него.

Нежелательные квантификаторы – это только удобство; в них нет ничего волшебного. Вам все равно, автор регулярных выражений, чтобы привести двигатель регулярного выражения в правильное и эффективное совпадение. Ваше регулярное выражение может возвращать правильные результаты, но это тратит много усилий в этом процессе. Он потребляет много символов, которые ему не нужны вначале, он избивает бесконечное исследование одних и тех же персонажей снова и снова, и это слишком долго, чтобы понять, когда его путь не может привести к совпадению ,

Теперь просмотрите это регулярное выражение:

 (?is)<tr[^<]*(?:<(?!/tr>|b>)[^<]*)*<b>\s*first science area of study\s*</b>.*?</tr>.*?<tr.*?>.*?<td.*?>.*?<b>(.*?) \((.*?)\).*?</b>(.*?credits.*?)</td>.*?<td.*?>(.*?<a .*?)</td>.*?</tr> course name start end steps Match #1 (Comp. Sci.) 209 275 9891 Match #2 (Bio & Chem) 276 341 5389 Match #3 (Enviro) 342 379 5833 Match #4 (Genetics) 386 416 4222 Match #5 (Chem) 417 455 4961 Match #6 (Math) 495 546 9899 Match #7 (Phys & Astro) 547 593 8506 Match #8 (no match) reported failure in 139 steps 

После первого </b> все так, как вы его написали. Эффект моих изменений заключается в том, что он не начинает сопоставляться всерьез, пока не найдет элемент <TR> который содержит первый <B> нам интересен:

 <tr[^<]*(?:<(?!/tr>|b>)[^<]*)*<b>\s*first science area of study\s*</b> 

Эта часть тратит большую часть времени жадно потребляющих персонажей с помощью [^<]* , что значительно быстрее, характер для персонажа, чем не жадный .*? , Но гораздо важнее то, что не требуется времени, чтобы выяснить, когда больше матчей невозможно. Если есть правило «Золотое правило» регулярного выражения, это так: когда попытка совпадения будет терпеть неудачу, она должна завершиться как можно быстрее.