Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Например, имеется html-текст: Код: html 1. который при отображении страницы выглядит так: 0&1;2;3 В этом html-тексте точку с запятой нужно заменить переходом на новую строку: Код: html 1. и будет выглядеть это так: 0&1 2 3 Задача простая ? На первый взгляд. Вручную парсить html-мнемоники не хочется. Можно ли решить задачу как-нибудь попроще ? Без ручного парсинга ? Пару html_entity_decode / htmlentities использовать не получится, поскольку htmlentities у фрагмента '<br/>' заменит угловые скобки на html-сущности и в результате вместо перехода на новую строку мы получим строку '<br/>': 0&1<br/>2<br/>3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2014, 20:20 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Пару html_entity_decode / htmlentities использовать не получится, поскольку htmlentities у фрагмента '<br/>' заменит угловые скобки на html-сущностиЭто было решение задачи в лоб. Думаю, можно сделать промежуточную замену, на что-то вроде '[br]', а затем, после обратного преобразования в сущности, заменить этот текст на требуемый. Еще можно посмотреть в сторону регулярных выражений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2014, 23:02 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
авторДумаю, можно сделать промежуточную замену, на что-то вроде '[br]', а затем, после обратного преобразования в сущности, заменить этот текст на требуемый. Вместо '<br/>' может быть любой текст, содержащий любые теги. Нужно общее решение. Да, можно во фрагменте, на который происходит замена (в сабжевом примере - '<br/>'), заменять все угловые скобки на некоторые комбинации, которые в html-тексте заведомо не встречаются (самый простой вариант - '[' и ']'), а в конце - их восстанавливать. Но здесь есть 2 проблемы: 1. Комбинации, которые в html-тексте заведомо не встречаются , когда-нибудь могут встретиться. 2. После выполнения всех процедур в html-тексте железно все символы (имеющие html-мнемоники) будут заменены на эти самые html-мнемоники. А желательно сохранить исходную картину - так как было в самом начале (какие-то символы - в виде символов, какие-то - в виде html-мнемоник). Т.е. данная процедура не должна производить никаких иных (побочных) манипуляций с html-строкой, кроме целевой замены (целевой задачи). Это одно из правил хорошего тона в программировании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 10:01 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Очень странно, что таком мощном языке как php не предусмотрено функций замены подстроки с исключением из поиска некоторых фрагментов (задаваемых, например, регуляркой). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 10:03 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Очень странно, что таком мощном языке как php не предусмотрено функций замены подстроки с исключением из поиска некоторых фрагментов (задаваемых, например, регуляркой). то что вы их не знаете, не значит то их нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 12:11 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
А, ясно. Это т.н. скрытые функции php . Доступ только по паролю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 14:08 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 14:56 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
ScareCrow https://php.net/manual/ru/function.preg-replace-callback.php Ну и каким образом Вы предполагаете внутри callback-функции определять, переданный ей фрагмент извлечён из html-сущности или нет ? (в первом случае замена выполняться НЕ должна, во втором случае - должна) Внутри callback-функции контекст передаваемого ей фрагмента неизвестен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 15:58 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
как хотите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 17:12 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Вообще-то, из того, что я описал, следует абсолютная бесполезность предложенной Вами функции preg_replace_callback() в решении сабжевой задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 18:32 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
...а также голословность утверждения: то что вы их не знаете, не значит то их нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 18:34 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, ну вообще ScareCrow вроде прав в плане preg_replace_callback (если я верно понял). можно составить регулярку как-то так: "/(&(#\d+|\w+))?;/" это позволит выловить все ";", а также всё, что потенциально является &-последовательностью. ну а в callback-е делать htmlspecialchars_decode выловленного участка, и если он не изменился, значит мы нашли не сущность и потому спокойно можем заменить ";" на "<br>" В общем как-то так :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 23:11 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
авторможно составить регулярку как-то так: "/(&(#\d+|\w+))?;/" это позволит выловить все ";", а также всё, что потенциально является &-последовательностью. ну а в callback-е делать htmlspecialchars_decode выловленного участка, и если он не изменился, значит мы нашли не сущность и потому спокойно можем заменить ";" на "<br>"Опять мимо: 1. htmlspecialchars_decode , htmlentities и html_entity_decode НЕ работают с кодами символов вида xxx; 2. Почему Вы зацикливаетесь на частностях ? Сегодня нужно найти заменить точку с запятой, завтра - амперсанд, а послезавтра - двузначное число. После прочтения конкретного примера из 1-го поста, я так думаю, должна была решаться такая задача: В строке str на подстроку substr2 необходимо заменить все подстроки substr1 , которые не входят в состав подстроки pass , задаваемой регулярным выражением. P.S. Когда нам требуется написать парсер арифметического выражения 2+2, мы ведь не пишем парсер, который понимает только это выражение - мы пишем парсер, который работает с любым арифметическим выражением. Это же логично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 10:14 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Cyrax_02В строке str на подстроку substr2 необходимо заменить все подстроки substr1 , которые не входят в состав подстроки pass , задаваемой регулярным выражением. preg_split с флагом PREG_SPLIT_DELIM_CAPTURE + preg_replace + implode. Но вообще-то первоначальная постановка вызывает много вопросов, например - а надо ли делать замены в значениях атрибутов в htlm тегах? А во встроенных таблицах стилей / javascript? А html-entity достаточно просто проверять по регулярному выражению, или нужно учитывать только реально существующие? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 13:06 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
авторpreg_split с флагом PREG_SPLIT_DELIM_CAPTURE + preg_replace + implode.Такой вариант я уже реализовал (правда, вместо preg_split + PREG_SPLIT_DELIM_CAPTURE использовал preg_replace + explode ). По скорости вариант неприемлем. Потому что для каждого полученного фрагмента снова вызывается обработчик регулярок. А обработчик регулярок должен быть вызван всего 1 раз - для разбития строки на подстроки по шаблону. Далее уже регулярки не трогаем. Такой вариант, думаю, реализуем с помощью preg_split + PREG_SPLIT_OFFSET_CAPTURE . Сейчас состряпаю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 18:49 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
авторА обработчик регулярок должен быть вызван всего 1 раз - для разбития строки на подстроки по шаблону. Далее уже регулярки не трогаем. Такой вариант, думаю, реализуем с помощью preg_split + PREG_SPLIT_OFFSET_CAPTURE.Всё так и есть. Этот вариант работает в несколько раз быстрее: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. По скорости - вполне приемлем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 19:34 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Только вот здесь Код: php 1. перед preg_match нужно поставить @ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 20:00 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Cyrax_02 P.S. Когда нам требуется написать парсер арифметического выражения 2+2, мы ведь не пишем парсер, который понимает только это выражение - мы пишем парсер, который работает с любым арифметическим выражением. Это же логично. Да... вы правы... Нефига на Новый год покупать фейерверки, которые не способны запустить спутник в космос... А рогатку сыну только ту, из которой в случае чего можно завалить медведя... Иначе смысл в таком фейерверке и в такой рогатке? Ну думаю продолжать обсуждать задачу смысла нету, так как оказалось, что перед Вами стоит совсем не та задача, которую Вы описали. авторВ строке str на подстроку substr2 необходимо заменить все подстроки substr1, которые не входят в состав подстроки pass, задаваемой регулярным выражением. Код: php 1. Только вот поставленная задача далека от первой, и соответственно решение к этой задаче не подойдёт для озвученной изначально. Или ставьте нормальную задачу... или закрывайте тему (а то Вам отвечают, а Вы тут аналогии непонятные приводите... типа поставили задачу, но решать надо не её, а некую сферическую в вакууме). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 22:48 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Cyrax_02перед preg_match нужно поставить @Зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2014, 10:42 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
vkleCyrax_02перед preg_match нужно поставить @Зачем? Чтобы не засорять логи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2014, 11:53 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
ПрограмёравторВ строке str на подстроку substr2 необходимо заменить все подстроки substr1, которые не входят в состав подстроки pass, задаваемой регулярным выражением. Код: php 1. Даже если предположить, что вместо str_replace Вы хотели написать preg_replace , то Ваш вариант всё-равно остаётся неработоспособным - в результирующей строке мы потеряем все фрагменты, соответствующие шаблону $pass. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2014, 12:20 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
ПрограмёрТолько вот поставленная задача далека от первой, и соответственно решение к этой задаче не подойдёт для озвученной изначально. Или ставьте нормальную задачу... или закрывайте тему (а то Вам отвечают, а Вы тут аналогии непонятные приводите... типа поставили задачу, но решать надо не её, а некую сферическую в вакууме). Вы сильно удивитесь, но решение задачи, которую выполняет функция func_strReplaceWithExclusion() - это и есть прямое и полное решение сабжевой задачи: Код: php 1. 2. 3. 4. 5. Получаем: Код: html 1. Если же что-то нужно заменить в составе тегов, то делаем так (используем ретроспективную позитивную проверку): Код: php 1. 2. P.S. Надеюсь, сферические кони в вакууме Вас больше не беспокоят ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2014, 12:26 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Програмёрпропущено... Код: php 1. Даже если предположить, что вместо str_replace Вы хотели написать preg_replace , то Ваш вариант всё-равно остаётся неработоспособным - в результирующей строке мы потеряем все фрагменты, соответствующие шаблону $pass. да... ошибся... думал через str_replace делать... потом понял что не получится и переписал на preg_replace.... только вот перепечатать префикс забыл )) А если сделать: Код: php 1. то ничего не потеряется (тут Вы ошиблись)... первый шаблон заменится сам на себя, а второй - на то что нужно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2014, 15:32 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Cyrax_02ПрограмёрТолько вот поставленная задача далека от первой, и соответственно решение к этой задаче не подойдёт для озвученной изначально. Или ставьте нормальную задачу... или закрывайте тему (а то Вам отвечают, а Вы тут аналогии непонятные приводите... типа поставили задачу, но решать надо не её, а некую сферическую в вакууме). Вы сильно удивитесь, но решение задачи, которую выполняет функция func_strReplaceWithExclusion() - это и есть прямое и полное решение сабжевой задачи: Код: php 1. 2. 3. 4. 5. Получаем: Код: html 1. Нет ))) не всё что имеет формат "&\w+;" является &-последовательностью. Как пример - и &nbps; Первая заменяется на пробел, а вторая не заменяется ни на что и не пропадает. Потому то я и сказал, что начальную задачу так не решить (без использования htmlspecialchars_decode или вбивания всех возможных мнемоник) :) А что Вы за лисапед намутили - вообще не понятно... решается одной строкой (как я написал, или просто регуляркой с использованием шаблона отрицательного просмотра назад (вроде так зовётся) ) P.S. Но как говорит мой бывший напарник - "тебе из погреба виднее". Просили подсказать - подсказали... а уж если свой вариант нравится больше, так никто же спорить не будет. Но если Ваш проект кому достанется... - я бы за такой код явно не поблагодарил :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2014, 15:55 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
ПрограмёрА если сделать: Код: php 1. то ничего не потеряется (тут Вы ошиблись)...Нет, я прав. Проверьте - и убедитесь, что строка $pass "теряется". А после того, как проверите, Вам станет ясно, что вместо "\0" нужно было писать '\0' или '$0'. Это Ваша 2-я ошибка . авторпервый шаблон заменится сам на себя, а второй - на то что нужно :)Да, второй шаблон заменится на то, что нужно, но не там, где нужно . Второй шаблон будет заменён и в том, фрагменте, который соответствует 1-му шаблону (во втором проходе). Т.е. точка с запятой будет заменена и в составе html-сущностей. Это Ваша 3-я ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2014, 17:36 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
авторА что Вы за лисапед намутили - вообще не понятно... решается одной строкой (как я написал...Той строкой, в которой Вы допустили 3 ошибки ? И которая абсолютно неработоспособна ? автор...или просто регуляркой с использованием шаблона отрицательного просмотра назад (вроде так зовётся) )Ретроспективная негативная проверка позволяет исключить слева какой-либо фрагмент, задаваемый регулярным выражением (например, можно вытащить из строки все html-теги или все текстовые фрагменты, не входящие в html-теги). Но ни коим образом не позволяет в общем виде проверить вхождение/невхождение некоторой строки (например, точки с запятой или слэша) в более длинную строку (например, в html-сущность или тег). Т.е. одним лишь регулярным выражением невозможно выполнить замену только тех подстрок, которые не входят в состав другой подстроки, задаваемой регуляркой. Это Ваша 4-я ошибка . авторP.S. Но как говорит мой бывший напарник - "тебе из погреба виднее". Просили подсказать - подсказали... а уж если свой вариант нравится больше, так никто же спорить не будет. Но если Ваш проект кому достанется... - я бы за такой код явно не поблагодарил :) Без комментариев. Нет слов... Видно, новая мода пошла среди программистов - ментальное программирование, словесные выкрутасы и "американская" пропаганда... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2014, 17:41 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Cyrax_02ПрограмёрА если сделать: Код: php 1. то ничего не потеряется (тут Вы ошиблись)...Нет, я прав. Проверьте - и убедитесь, что строка $pass "теряется". А после того, как проверите, Вам станет ясно, что вместо "\0" нужно было писать '\0' или '$0'. Это Ваша 2-я ошибка . авторпервый шаблон заменится сам на себя, а второй - на то что нужно :)Да, второй шаблон заменится на то, что нужно, но не там, где нужно . Второй шаблон будет заменён и в том, фрагменте, который соответствует 1-му шаблону (во втором проходе). Т.е. точка с запятой будет заменена и в составе html-сущностей. Это Ваша 3-я ошибка. Тяжёлый рабочий день без возможности подумать и отладить... что тут поделаешь... приношу извинения за ошибки... Однако :) Насчёт лисапеда ... Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. всё же 1 строка :) ну или 3, если с форматированием по фэншую :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2014, 22:54 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
кстати... поправка )) Тут возможен баг при использовании групп в вводимых шаблонах... потому вместо "/($pass)|($substr1)/u" лучше юзать именованные группы: "/(?P<pass>$pass)|(?P<repl>$substr1)/u". Ну и соответственно проверять в коллбэке не группу 2, а группу "repl". Вроде так :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2014, 23:07 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
А вот теперь ещё интереснее. Что если $substr1 содержит регулярное выражение, а $substr2 - подмаски вида '$x' ? Только не говорите, что это не имеет отношения к сабжевой задаче и что это надуманное условие. Это условие как раз-таки самое актуальное: точка с запято й может иметь слева или справа произвольное число пробелов, которые вместе с точкой с запятой должны быть заменены на '<br/>'. Без регулярки здесь не обойтись (как и во множестве других реальных случаях). Мой вариант такой: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Ваш вариант ? Не обязательно программировать. Можете описать алгоритм словесно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 11:12 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, я что-то не так сделал? или Вам надо отлаживать свой вариант? Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. на выходе получил: <span>&<br/>1<br/>2<br/>3/4/5</span> Думаю отлаживать надо... если из preg_quote($pass, '/') убрать экранирование, то в результате получаем 2 строки (не хочу разбираться почему... Ваш вариант - Вам его отлаживать ;) ), где первая неправильная, а вторая правильная... В общем предлагаю предоставить правильное решение для предложенных входных данных (то есть не только функцию, но и пример её работы... что бы ошибки были видны явно, а не сидеть и мозговать правильно ли понял собеседника :) ). Ну а я пока посижу над решением ситуации с заменой с учётом групп :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 11:56 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
мой вариант с заменой групп: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. если в $substr1 присутствует просмотр вперёд или назад нулевой длины, тогда возникнут сложности с заменой подгрупп (так как входная строка попадёт во внутренний preg_replace несоответсвующей шаблону). Но это уже по-моему совсем крайность и извращение :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 12:40 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
авторДумаю отлаживать надо... если из preg_quote($pass, '/') убрать экранирование, то в результате получаем 2 строки (не хочу разбираться почему... Ваш вариант - Вам его отлаживать ;) ), где первая неправильная, а вторая правильная... 1. Почему при тестировании Вами моей функции точка с запятой заменяется также и в html-сущности $amp; - потому что Вы подаёте на вход некорректные данные. А именно: строка $pass должна быть либо регулярным выражением, либо обычной строкой. А у Вас - ни то, ни другое (обычная строка, но содержащая спец.символы из регулярных выражений). В результате вот этот код Код: php 1. распознаёт в ней обычную строку (а в обычной строке все символы обозначают сами себя) и преобразует её в регулярное выражение, которое соответствует строке '&\w+;'. Именно эта строка (которой, естественно, нет в $str), и исключается из анализа. Т.е. нужно указывать либо '/&\w+;/' (регулярное выражение), либо '$amp;' (обычная строка). 2. А почему получаем 2 строки - потому что вот здесь Код: php 1. в самом конце вместо $str нужно указывать $part[0]. Перед тем, как выложить усовершенствованный вариант функции на форум (вариант, которому можно передавать в $substr1 регулярное выражение) я провёл некоторую обфускацию, в ходе которой из-за копипастов оставил там $str (в исходном варианте всё было правильно). Вот окончательный корректный вариант моей функции, которой можно выполнять замену $substr1 на $substr2 и по подстроке, и по регулярному выражению: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. В своём предыдущем посте я хотел сказать, что с задачей В строке str на подстроку substr2 необходимо заменить все подстроки substr1, которые не входят в состав подстроки pass. Строка $pass и $substr1 могут быть и обычными строками, и регулярными выражениями. мой вариант справляется, а Ваш - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 13:21 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Вот входные данные для моего варианта: 1. Удаление точки с запятой (в html-сущностях замена не производится): Код: php 1. 2. 3. 4. 2.Удаление точки с запятой и слэша (в html-сущностях замена не производится) Код: php 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 13:26 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Cyrax_02В своём предыдущем посте я хотел сказать, что с задачей В строке str на подстроку substr2 необходимо заменить все подстроки substr1, которые не входят в состав подстроки pass. Строка $pass и $substr1 могут быть и обычными строками, и регулярными выражениями. мой вариант справляется, а Ваш - нет. А чем мой то не справляется сейчас? ) Разве только он на вход не принимает строки... но тут вопрос производительности... так как для обычных строк (заменить одну подстроку на другую, но только если заменяемая подстрока не является частью другой подстроки) это делается через explode, str_replace и implode... Код: php 1. это намного быстрее, чем регулярками орудовать... а с регулярками неоднозначная ситуация получается... а что, если мне из кода надо будет определённый коммент вырезать? Ваша функция поведёт себя неправильно, то как /*...*/ поймёт как регулярку, а не строку... А ещё предвижу проблему функции при использовании utf-8, так как в ней пользуются substr и strlen, которые не умеют работать с многобайтовыми кодировками :) То есть на не английском тексте она сломается... моя тоже... но у меня это решится просто, посредством добавления/удаления модификатора "u"... А в идеале вообще оставить это на усмотрение использующего... то есть вот так: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 14:57 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Вот пример, на котором Ваша функция либо запарывается, либо выдаёт неверный результат: Требуется заменить на звёздочку все фрагменты markXX (в любом регистре) кроме тех, которые имеют верхний регистр и заключены в квадратные скобки ([MARKxx]) : Код: php 1. 2. 3. 4. Результат должен быть таким (именно такой результат выдаёт моя функция): Код: php 1. Ваша функция запарывается. Если же Вы в своей функции предварительно будете удалять модификаторы у $pass и $substr1, то функция вернёт неверный результат: Код: php 1. Если же модификатор i Вы поставите результирующему регулярному выражению, то функция по-прежнему вернёт неверный результат: Код: php 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 15:02 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
авторэто намного быстрее, чем регулярками орудовать...В моём коде как раз для этого и предусмотрена строка: Код: php 1. Если передаётся строка - используется str_replace, если передаётся регулярка - preg_replace. автора с регулярками неоднозначная ситуация получается... а что, если мне из кода надо будет определённый коммент вырезать? Ваша функция поведёт себя неправильно, то как /*...*/ поймёт как регулярку, а не строку...Так это не проблема. Достаточно добавить функции ещё один или 2 параметра булевского типа. А писать отдельные функции для каждого варианта не кошерно, поскольку, таких вариантов - 4 штуки (и $pass, и $substr1 могут быть и регулярками, и строками). авторА ещё предвижу проблему функции при использовании utf-8, так как в ней пользуются substr и strlen, которые не умеют работать с многобайтовыми кодировками :) То есть на не английском тексте она сломается...Точно удивитесь, но моя функция на многобайтовых кодировках работает отлично. Сможете объяснить, почему ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 15:16 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Вот вариант функции, лишённый всех недостатков: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Дополнительные параметры: $substrPreg - признак регулярного выражения (true/false). По умолчанию определяется автоматически. $passPreg - признак регулярного выражения (true/false). По умолчанию определяется автоматически. Функция работает с любыми кодировками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 16:30 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Cyrax_02авторА ещё предвижу проблему функции при использовании utf-8, так как в ней пользуются substr и strlen, которые не умеют работать с многобайтовыми кодировками :) То есть на не английском тексте она сломается...Точно удивитесь, но моя функция на многобайтовых кодировках работает отлично. Сможете объяснить, почему ? Мы тут беседуем, дабы найти истину )) Потому давайте я не буду гадать, а лучше, если мой аргумент неверен, так опровергайте (с объяснением в чём ошибка) и двинемся далее :) Иначе разговора не получится... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 16:35 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
и ещё... как функция должна себя вести, если $substr1 = "/\w{5,7}/", а $pass = "/\w{2,3}/"? Ну то есть если не substr является частью pass, а наоборот... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 16:58 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
если нужны модификаторы, разные для двух регулярок - тогда только двумя по отдельности обработать... а потому только разбить по одной, заменить по другой... и слепить назад... то есть preg_split, preg_replace, foreach[$res .= ...] Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 17:50 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
автор если мой аргумент неверен, так опровергайте (с объяснением в чём ошибка) и двинемся далее :) Доказывается опытным путём. Всё работает.А работает по той причине, что preg_split() возвращает байтовые позиции (символьные позиции возвращать не умеет) и соответственно, функции substr и strlen тоже должны работать исключительно с байтами, независимо от кодировки строк. Поскольку работают эти функции только с результатами выполнения preg_split(), то никаких проблем не возникает. Да и вообще, байтовые операции работают быстрее, чем символьные. автори ещё... как функция должна себя вести, если $substr1 = "/\w{5,7}/", а $pass = "/\w{2,3}/"? Ну то есть если не substr является частью pass, а наоборот... Строго формально, в таких случаях фрагменты $substr1 (внутри которых которых содержится фрагмент $pass), замене не подлежат (именно так и работают наши функции), поскольку запрет на замену части подстроки $substr делает невозможным замену всей подстроки (что-то вроде deadlock'а). А если и требуется такая замена, то здесь нужно усложнять логику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 19:32 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Програмёресли нужны модификаторы, разные для двух регулярок - тогда только двумя по отдельности обработать... а потому только разбить по одной, заменить по другой... и слепить назад... то есть preg_split, preg_replace, foreach[$res .= ...] Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. Так значит, Вы отказались от Вашего варианта ? Я ожидал, что Вы реализуете вариант, когда модификаторы стоят внутри регулярного выражения (такое возможно): http://webdebri.ru/pcre/modifiers-pattern-regexp-php ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 19:36 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Програмёресли нужны модификаторы, разные для двух регулярок - тогда только двумя по отдельности обработать... а потому только разбить по одной, заменить по другой... и слепить назад... то есть preg_split, preg_replace, foreach[$res .= ...] Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. Так значит, Вы отказались от Вашего варианта ? Я ожидал, что Вы реализуете вариант, когда модификаторы стоят внутри регулярного выражения (такое возможно): http://webdebri.ru/pcre/modifiers-pattern-regexp-php Не знал что так можно.... ))) Но... в любом случае мне кажется такое ненормальным... я то беседу начал потому, что внешний вид кода мне не понравился (для меня он слабочитаем.. не знаю как для других)... Но вот спорить-спорить, а потом сделать ещё хуже - не вижу смысла )))) (фиг потом разберёшься что в этой регулярке происходит, и почему так). Но я не теряю веры, что можно всё же сделать легче :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2014, 20:51 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
авторфункции substr и strlen тоже должны работать исключительно с байтами http://php.net/manual/en/mbstring.overload.php авторFor example, mb_substr() is called instead of substr() if function overloading is enabled. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 05:32 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
ScareCrowавторфункции substr и strlen тоже должны работать исключительно с байтами http://php.net/manual/en/mbstring.overload.php авторFor example, mb_substr() is called instead of substr() if function overloading is enabled. Буду знать про такое. В любом случае у меня в php.ini нет настройки mbstring.func_overload. Всё-таки эта возможность в какой-то степени является вредной, поскольку функции preg_xxx не имеют mb-аналогов. Т.е. для остальных функций overloading выполняться будет, а для preg - нет. В итоге скрипты будут работать некорректно. Уж лучше везде использовать mb-функции (для preg - собственные аналоги), просто предавать им соответствующую кодировку через константу или функцию. И при переносе сервера достаточно будет изменить кодировку в одном месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 10:37 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
в phpinfo посмотри ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 15:43 |
|
||
|
(php) замена текста, пропуская html-мнемоники
|
|||
|---|---|---|---|
|
#18+
ScareCrowв phpinfo посмотриmbstring.detect_order no value no value mbstring.encoding_translation Off Off mbstring.func_overload 0 0 mbstring.http_input pass pass mbstring.http_output pass pass mbstring.http_output_conv_mimetypes ^(text/|application/xhtml\+xml) ^(text/|application/xhtml\+xml) mbstring.internal_encoding no value no value mbstring.language neutral neutral mbstring.strict_detection Off Off mbstring.substitute_character no value no value Вы не можете поверить, что func_strReplaceWithExclusion() нормально работает с многобайтными кодировками ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 19:30 |
|
||
|
|

start [/forum/topic.php?all=1&fid=23&tid=1462552]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
85ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 375ms |

| 0 / 0 |
