За последние 24 часа нас посетил 18301 программист и 1599 роботов. Сейчас ищет 841 программист ...

Парсер и автозамена типографики

Тема в разделе "Прочие вопросы по PHP", создана пользователем Kristof, 17 дек 2013.

  1. Kristof

    Kristof Guest

    Есть текст, который ввёл пользователь. Текст отображается на сайте.
    Задача: проверить, действительно ли отображается ли текст на сайте.

    Берём всю страницу с помощью cURL и ищем в ней тот текст, что ввёл пользователь. Всё хорошо до тех пор, пока пользователь не использует многоточие, например. Сайт вспоминает правила типографики и заменяет три точки на символ многоточия (…), который в исходном коде виден как & # 8230 ; (без пробелов, конечно).

    В исходном тексте три последовательные точки. В итоговом - код символа. Парсер говорит, что текст не нашёл. Потому как ищет тот, с тремя точками.

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

    Как можно восстановить работу парсера, чтобы он не спотыкался на таких символах?
     
  2. AmsTaFFix

    AmsTaFFix Активный пользователь

    С нами с:
    10 дек 2013
    Сообщения:
    22
    Симпатии:
    0
    приписать ему особые правила, чтобы воспринимал ... так же как и ... (кодом)... покажите код
     
  3. Kristof

    Kristof Guest

    Код чего показать? Строка ищется обычным strpos().
    Понятно, что нужно прописать особые правила особым способом. Но какие конкретно правила смогут обойти автозамену символов по правилам типографики? Просто перечислять все подряд варианты (hint: их довольно много) автозамены, которую могут делать разные движки?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    После того, как взяли страницу cURL, замените в ней … на три точки. Ну и остальные варианты придётся менять. Другая возможность - удалите все знаки препинания из обоих текстов перед сравнением
     
  5. Kristof

    Kristof Guest

    И для каждого кода символа сделать такую же замену? На все варианты кодов символов (на каждый символ бывает 2-3 варианта)?

    Какая функция может идентифицировать … как знак препинания? К сожалению, не удалось такую найти.
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну для таких последовательностей можно регулярку написать, чтоб их удалить.
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Подсказка: str_replace принимает на вход массивы.
     
  8. Kristof

    Kristof Guest

    Это всё вариации того же самого - на все возможные символы написать все возможные варианты кодов и их удаление/замену.

    Но хотелось бы, конечно, что-то не такое хардкодное.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ну тогда вам нужна магия. Ждите сову из Хогвартса.
     
  10. Kristof

    Kristof Guest

    Если способ, который вы хотите предложить, уже предложен, вполне логично просто промолчать. И ещё логичнее промолчать, если вам сообщили, что предложенный вами способ предложен в самом начале топика.

    Но спасибо за внимание, конечно. Надеюсь, упражнение в остроумии достаточно подняло ваше ЧСВ.
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А что такого хардкорного?
    Код (Text):
    1.  
    2. $str = preg_replace("!\\&\\#\d{1,4};!", "", $str);
    За правильность регулярки не ручаюсь, ночь всё-таки, но идею, думаю, вы поняли
     
  12. Kristof

    Kristof Guest

    Так написано "хардкодного".

    Да, примерно так. Вырезать все знаки препинания из оригинала и все знаки препинания плюс &***; из страницы. Видимо, так и придётся.
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Не, то было не упражнение, а сарказм. Мое остроумие всегда при мне и в упражнениях не нуждается. Тут дело какое:
    1) Вам нужно выпилить N конструкций из текста;
    2) Без составления списка этих конструкций;
    3) Без поиска и замены этих конструкций;

    То есть нужен скрипт "поди туда, скажу куда, выпили то, не знаю что".
    Взаимоисключающие параграфы разруливаются только магией, вот я ее и предложил.

    Да не нужна тут регулярка. Strreplace хватит за глаза. Он и работает быстрее в разы. В документации это отдельным пунктом вынесено, мол "если задача тривиальная, в стиле <найти и заменить>, не юзайте регулярки, юзайте нативные функции".
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Str_replace может принимать массивы в аргументах
     
  15. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Ну да, на все возможные, и не париться. А всех возможных там будет 1-2 штуки.
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Я уже говорил выше)))
    Да хоть 10, вообще не проблема же.
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я чую надо еще раз восемь сказать =)

    Добавлено спустя 30 секунд:
    кстати
    есть же функция неточного сравнения текста =)

    Добавлено спустя 1 минуту 43 секунды:
    http://php.ru/manual/function.levenshtein.html
    не, не подходит
     
  18. Kristof

    Kristof Guest

    Обожаю форумы. Один скажет по делу, потом ещё пятеро повторят то же самое и наконец самоутвердятся.

    Весьма очевидно, что можно отследить все замены, которые делают все существующие движки для сайтов для всех существующих символов, и написать на каждый случай своё условие. Я понимаю, что хочется блеснуть интеллектом и ещё раз сказать очевидное, но не так же часто.

    Кстати, о функциях, удаляющих конструкции без тупого перечисления конструкций. Жив и здоров strip_tags(), например. Хотя, возможно, кому-то это кажется магией.

    В общем, всем спасибо за участие, за пафос и mkramer - за конструктив. За сим удаляюсь.
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну блин. если тебе пятеро что-то говорят не сговариваясь, ну наверное имеет смысл задуматься.
     
  20. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Потому что любой тег это конструкция вида <pew></pew>, легко поддающаяся поиску по паттерну. А вы хотите кнопку "прочитай мысли и сделай зaeбиcь".