Есть текст, который ввёл пользователь. Текст отображается на сайте. Задача: проверить, действительно ли отображается ли текст на сайте. Берём всю страницу с помощью cURL и ищем в ней тот текст, что ввёл пользователь. Всё хорошо до тех пор, пока пользователь не использует многоточие, например. Сайт вспоминает правила типографики и заменяет три точки на символ многоточия (…), который в исходном коде виден как & # 8230 ; (без пробелов, конечно). В исходном тексте три последовательные точки. В итоговом - код символа. Парсер говорит, что текст не нашёл. Потому как ищет тот, с тремя точками. Разные сайты интерпретируют символы по-разному. Где-то заменяется так, где-то иначе, где-то не заменяется вообще. А искать нужно. Как можно восстановить работу парсера, чтобы он не спотыкался на таких символах?
Код чего показать? Строка ищется обычным strpos(). Понятно, что нужно прописать особые правила особым способом. Но какие конкретно правила смогут обойти автозамену символов по правилам типографики? Просто перечислять все подряд варианты (hint: их довольно много) автозамены, которую могут делать разные движки?
После того, как взяли страницу cURL, замените в ней … на три точки. Ну и остальные варианты придётся менять. Другая возможность - удалите все знаки препинания из обоих текстов перед сравнением
И для каждого кода символа сделать такую же замену? На все варианты кодов символов (на каждый символ бывает 2-3 варианта)? Какая функция может идентифицировать … как знак препинания? К сожалению, не удалось такую найти.
Это всё вариации того же самого - на все возможные символы написать все возможные варианты кодов и их удаление/замену. Но хотелось бы, конечно, что-то не такое хардкодное.
Если способ, который вы хотите предложить, уже предложен, вполне логично просто промолчать. И ещё логичнее промолчать, если вам сообщили, что предложенный вами способ предложен в самом начале топика. Но спасибо за внимание, конечно. Надеюсь, упражнение в остроумии достаточно подняло ваше ЧСВ.
А что такого хардкорного? Код (Text): $str = preg_replace("!\\&\\#\d{1,4};!", "", $str); За правильность регулярки не ручаюсь, ночь всё-таки, но идею, думаю, вы поняли
Так написано "хардкодного". Да, примерно так. Вырезать все знаки препинания из оригинала и все знаки препинания плюс &***; из страницы. Видимо, так и придётся.
Не, то было не упражнение, а сарказм. Мое остроумие всегда при мне и в упражнениях не нуждается. Тут дело какое: 1) Вам нужно выпилить N конструкций из текста; 2) Без составления списка этих конструкций; 3) Без поиска и замены этих конструкций; То есть нужен скрипт "поди туда, скажу куда, выпили то, не знаю что". Взаимоисключающие параграфы разруливаются только магией, вот я ее и предложил. Да не нужна тут регулярка. Strreplace хватит за глаза. Он и работает быстрее в разы. В документации это отдельным пунктом вынесено, мол "если задача тривиальная, в стиле <найти и заменить>, не юзайте регулярки, юзайте нативные функции".
я чую надо еще раз восемь сказать =) Добавлено спустя 30 секунд: кстати есть же функция неточного сравнения текста =) Добавлено спустя 1 минуту 43 секунды: http://php.ru/manual/function.levenshtein.html не, не подходит
Обожаю форумы. Один скажет по делу, потом ещё пятеро повторят то же самое и наконец самоутвердятся. Весьма очевидно, что можно отследить все замены, которые делают все существующие движки для сайтов для всех существующих символов, и написать на каждый случай своё условие. Я понимаю, что хочется блеснуть интеллектом и ещё раз сказать очевидное, но не так же часто. Кстати, о функциях, удаляющих конструкции без тупого перечисления конструкций. Жив и здоров strip_tags(), например. Хотя, возможно, кому-то это кажется магией. В общем, всем спасибо за участие, за пафос и mkramer - за конструктив. За сим удаляюсь.
Потому что любой тег это конструкция вида <pew></pew>, легко поддающаяся поиску по паттерну. А вы хотите кнопку "прочитай мысли и сделай зaeбиcь".