За последние 24 часа нас посетили 17404 программиста и 1682 робота. Сейчас ищут 956 программистов ...

str_replace не заменяет <

Тема в разделе "PHP для новичков", создана пользователем kentastik77, 21 дек 2012.

  1. kentastik77

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

    С нами с:
    21 мар 2010
    Сообщения:
    89
    Симпатии:
    0
    Есть статья, хочу в ней почистить всякое. Для примера делаю так
    $content = str_replace("<p>&nbsp;</p>", "", $content);
    Если я вставляю данный скрипт на страничку вывода этой самой статьи он прекрасно отрабатывает, но решил сделать красиво и удалять это перед записью моей cms в БД. Вставил туда это и с удивлением обнаружил, что замена тегов не получается. Если меняю любой просто текст всё прекрасно, "<" и ">" видимо и есть камень преткновения. Подскажите как это можно победить?
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Странно
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    наверное перед заменой ты где-то делаешь htmlspecialchars
     
  4. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Работает как нужно. Попробуй так:
    Код (Text):
    1. echo str_replace("<p>&nbsp;</p>", "", htmlspecialchars_decode($content));
     
  5. kentastik77

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

    С нами с:
    21 мар 2010
    Сообщения:
    89
    Симпатии:
    0
    спасибо за помощь, но не помогло, к счастью это легко решается регуляркой :) (и почему я сразу об этом не подумал? ))
     
  6. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    считай что на изоленту налепил ещё одну изоленту
    лучше найди причину. выведи текст до str_replace и после.
     
  7. kentastik77

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

    С нами с:
    21 мар 2010
    Сообщения:
    89
    Симпатии:
    0
    а где же я найду текст ДО, если я сразу в базу записываю измененный текст? если писать в базу текст с мусором, то на выводе страницы все и так работало.
     
  8. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    До того как изменяешь текст выведи, в чем проблема то?
     
  9. kentastik77

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

    С нами с:
    21 мар 2010
    Сообщения:
    89
    Симпатии:
    0
    кстати, с некоторыми тегами мне удалось разобраться. Сделал предварительное "правильное" форматирование, ибо там встречались варианты по типу таких "<p >", дальше решил попробовать более сложные элементы по типу ссылок вот тут опять получилась загвоздка.
    Попробовал такую регулярку. На странице с 2-мя ссылками (разные домены). Одну ест, вторую не хочет.
    Код (Text):
    1. $content = preg_replace('#<a href="http://site1.*?</a>#is', "", $content);
    2. $content = preg_replace('#<a href="http://site2.*?</a>#is', "", $content);
    Кстати чем плох такой вариант?
    Если надо все ссылки убрать, то без проблем работает такой вариант:
    Код (Text):
    1. $content = preg_replace('#<a href=.*?</a>#is', "", $content);
    Добавлено спустя 23 минуты 45 секунд:
    Текст до записи:
    <p><b>GBP/USD h4&nbsp; </b></p>
    <blockquote> <br />
    <br />
    Операционный масштаб <b>Minute</b> <br />
    <br />
    <b><i>Текущая ситуация:</i></b> <br />
    <br />
    Цена <b>GBP/USD</b>, отбившись от <b>1/2 Median Line Minute</b> (<b>1.6289</b>), оказалась в границах <b>зоны равновесия</b> вил <b>младшего </b>операционного масштаба <b>Minuette</b> <b>1.6210 &lt;-&gt; 1.6175 &lt;-&gt; 1.6142</b>, отработка которых и станет определять движение цены инструмента в оставшиеся дни торговых сессий 2012 г. (<b>с 24 по 31 декабря</b>). <br />
    <br />
    <i><b>Детализация вариантов движения:</b></i> <br />
    <br />
    -&gt; <b><i>флетовое движение </i></b>в границах <b>зоны равновесия </b>вил <b>младшего </b>операционного масштаба <b>Minuette</b> -&gt; <b>1.6210 &lt;-&gt; 1.6175 &lt;-&gt; 1.6142</b>; <br />
    <br />
    -&gt; <b>пробой </b>уровня <b>сопротивления 1.6210</b> на верхней границе <b>зоны равновесия</b> вил <b>младшего </b>операционного масштаба <b>ISL38.2 Minuette</b> направит цену к границам <b>канала 1/2 Median Line Minuette</b> -&gt; <b>1.6233 &lt;-&gt; 1.6253 &lt;-&gt; 1.6275</b>, а пробой<b> 1/2 Median Line Minute</b> (<b>1.6289</b>) сделает возможным достижение целей -&gt;<b> 1.6314</b> (начальная линия <b>SSL Minuette</b>) <b>&lt;-&gt; 1.6369</b> (верхняя граница <b>канала 1/2 Median Line</b> вил <b>старшего </b>операционного масштаба <b>Minute</b>); <br />
    <br />
    -&gt; <b>пробой </b>уровня <b>поддержки 1.6142</b> на нижней границе <b>зоны равновесия</b> вил <b>младшего </b>операционного масштаба <b>ISL61.8 Minuette</b> сделает актуальным продолжение нисходящего движения к целевым уровням -&gt; <b>1.6081 </b>(начальная линия вил <b>старшего </b>операционного масштаба <b>SSL Minute</b>) <b>&lt;-&gt; 1.6036</b> (конечная линия <b>FSL Minuette</b>) <b>&lt;-&gt; 1.5967</b> (предупредительная линия <b>LWL50.0 Minuette</b>) <b>&lt;-&gt; 1.5953</b> (контрольная линия <b>LTL Minute</b>). <br />
    <br />
    <br />
    &nbsp; <br />
    <img width="450" src="http://forex-images.instaforex.com/userfiles/20121221/GBP_h4_24.12_31.12.png" alt="" /> <br />
    <br />
    Вопросы и обсуждение обзоров -&gt; <a href="http://ruforum.mt5.com/threads/18266-analitika-ot-olega-hmelevskogo-obsuzhdenie-i-voprosi-avtoru/page2" ><b>Аналитика от Олега Хмелевского: обсуждение и вопросы автору</b></a> <br />
    <br />
    Блог -&gt; <a href="http://blog.mt5.com/geloxm" ><b> Gelox Blog</b></a> <br />
    <br />
    <b><a href="http://instaforex.com/ru/forex_analysis?author=22?x=DPYV" >Ежедневные обзоры валютных инструментов на instaforex.com</a></b> </blockquote>
    <p>&nbsp;</p>Материал предоставлен компанией Instaforex - <a href='http://instaforex.com/ru'>instaforex.com</a>

    После применения таких фильтров
    Код (Text):
    1.  
    2.     $content = str_replace("<p>&nbsp;</p>", "", $content);
    3.     $content = str_replace("<p >&nbsp;</p>", "", $content);
    4.     $content = str_replace("<b> </b>", "", $content);
    5.     $content = str_replace("<p >", "<p>", $content);
    6.     $content = str_replace("<p></p>", "", $content);
    7.     $content = str_replace("<blockquote>", "", $content);
    8.     $content = str_replace("</blockquote>", "", $content);
    9.     $content = preg_replace('#Материал предоставлен.*?</a>#is', "", $content);
    10.     $content = preg_replace('#<a href="http://blog.mt5..*?</a>#is', "", $content);
    11.     $content = preg_replace('#Блог .*?</a>#is', "", $content);
    12.     $content = preg_replace('#Вопросы и обсуждение обзоров.*?</a>#is', "", $content);
    13.     $content = preg_replace('#<a href="http://instaforex.*?</a>#is', "", $content);
    <p><b>Gold h4&nbsp;</b></p>

    Операционный масштаб <b>Minute</b> <br />
    <br />
    <b><i>Текущая ситуация:</i></b> <br />
    <br />
    Цена <b>Gold</b>, отбившись от <b>Median Line Minute</b> (<b>1635.07</b>), на текущий момент не смогла пробить уровень сопротивления <b>1658.99 </b>на нижней границе <b>зоны равновесия </b>вил <b>младшего </b>операционного масштаба <b>ISL61.8 Minuette</b>, тем самым оказалась в диапазоне -&gt; <b>1649.08</b> (<b>ISL38.2 Minute</b>) <b>&lt;-&gt; 1658.99</b> (<b>ISL61.8 Minuette</b>), направление выхода из которого и станет определять развитие движения цены инструмента <b>с 24 по 31 декабря 2012 г.</b> <br />
    <br />
    <i><b>Детализация вариантов движения:</b></i> <br />
    <br />
    -&gt; возможно <i><b>флетовое движение</b></i> в этом <b>диапазоне </b>-&gt; <b>1649.08</b> (верхняя граница <b>зоны равновесия</b> вил <b>старшего </b>операционного масштаба<b> ISL38.2 Minute</b>) <b>&lt;-&gt; 1658.99 </b>(нижняя граница <b>зоны равновесия </b>вил <b>младшего </b>операционного масштаба <b>ISL61.8 Minuette</b>); <br />
    <br />
    -&gt; <b>пробой </b>уровня <b>сопротивления 1658.99</b> (<b>ISL61.8 Minuette</b>) определит движение в границах <b>зоны равновесия</b> вил <b>младшего </b>операционного масштаба <b>Minuette</b> -&gt; <b>1658.99 &lt;-&gt; 1664.89 &lt;-&gt; 1670.38</b>, в случае пробоя<b> ISL38.2 Minuette</b> (<b>1670.38</b>) цена вернется в границы <b>канала 1/2 Median Line</b> вил <b>старшего </b>операционного масштаба <b>Minute</b> -&gt;<b> 1670.38 &lt;-&gt; 1681.83 &lt;-&gt; 1693.28</b>, движение внутри которых станет зависеть от отработки <i>уровней границ <b>канала 1/2 Median Line Minuette</b> </i>(<b>1677.30 &lt;-&gt; 1681.83 &lt;-&gt; 1688.03</b>), <i><b>взаимодействие </b></i>указанных уровней показано <i><b>на графике</b></i>; <br />
    <br />
    -&gt; <b>пробой </b>уровня<b> поддержки 1649.08 </b>(<b>ISL38.2 Minute</b>) вернет движение цены инструмента в границы <b>зоны равновесия</b> вил <b>старшего </b>операционного масштаба <b>Minute</b> -&gt; <b>1649.08 &lt;-&gt; 1635.07 &lt;-&gt; 1619.80</b>, данное движение так же станет определяться отработкой <i><b>уровней </b>линий вил <b>младшего </b>операционного масштаба <b>Minuette</b></i>, <i><b>подробности </b></i>смотрим <b>на графике</b>, в случае пробоя <b>ISL61.8 Minute </b>(<b>1619.80</b>) движение может быть продолжено к целевым уровням -&gt; <b>1610.49 </b>(контрольная линия <b>LTL Minuette</b>) <b>&lt;-&gt; 1572.55</b> (конечная линия <b>FSL Minute</b>). <br />
    <br />
    <br />
    &nbsp; <br />
    <img width="450" src="http://forex.rpif.net/wp-content/plugins/wp-o-matic/cache/db26a71b2b_Gold-h4-24-12-31-12.png" alt="" /> <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <b><a href="http://instaforex.com/ru/forex_analysis?author=22?x=DPYV" target="_blank">Ежедневные обзоры валютных инструментов на instaforex.com</a></b>

    Последняя ссылка в данном случае не исчезла.
     
  10. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    Ладно.
    1. str_replace и preg_replace принимают массивы что на что заменять.
    2. фиксить пробелы глупо через str_replace("<p >", "<p>", $content); , если в одном теге мура приходит, то и в остальных тоже будет, потому хотя бы примитивно можно делать str_replace(" >", ">", $content);
    3. Юзаешь видимо WYSIWYG редактор, наверняка tinymce, но забываешь что на твою пхпшку могут послать что угодно. В присланном хтмл может быть и <iframe>, и <script>, и <!script>, и <style>, и <meta> и т.п. Тут нужно включать paranoia mode.
    4. Разбираться зачем ты юзаешь чтото по типу $content = preg_replace('#Материал предоставлен.*?</a>#is', "", $content); даже не буду. Если тебе форму заполняют по шаблону, то это должна быть форма с лейблами и т.п, а не готовый хтмл шаблон отправки который ты всё-равно режешь. Если ты будешь так агрессивно использовать риплейсы и регулярки, то проще и, как минимум, в 10 раз быстрее будет кодиться если поставишь phpQuery или хотя бы Simple HTML DOM. Работать они возможно будут даже быстрее чем множество регулярок и риплейсов проходящих по одному и тому же тексту множество раз. И в любом случае с любой из этих либ. будет кодиться проще и быстрее.
     
  11. kentastik77

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

    С нами с:
    21 мар 2010
    Сообщения:
    89
    Симпатии:
    0
    Спасибо за внимание к моей проблеме, но как всегда есть много НО. Всё это дело работает на вордпрессе, поэтому в код редактора не лезу, чтобы при очередном обновлении это всё дело не слегло, по этой же причине отлетают и phpQuery с Simple HTML DOM. Ну и самое главное, что текст может быть написан не только через редактор, но и даваться через программы удаленного постинга, рсс и т.д. и т.п. вот собственно после последних и появляется весь этот мусор. Та статья, что я привел можно сказать почти чистая, чаще прилетает такое, что мама не горюй. Насчет str_replace(" >", ">", $content); за мысль спасибо, но сейчас я не ввожу каких-то глобальных правил я просто пытаюсь замутить скриптик, который бы без проблем менял тексты по ЛЮБЫМ шаблонам.
     
  12. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    нужно лезть в место где вы записываете это в базу. в редактор лезть и не надо.
     
  13. kentastik77

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

    С нами с:
    21 мар 2010
    Сообщения:
    89
    Симпатии:
    0
    сейчас я так и делаю :)
     
  14. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    ну вот там и подключать phpQuery или PHP Simple HTML DOM. Дальше через них парсить входящий хтмл и вырубать и врубать что надо.
     
  15. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    kentastik77,
    Посмотри так же функцию striptags:
    php.net/manual/en/function.strip-tags.php
     
  16. kentastik77

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

    С нами с:
    21 мар 2010
    Сообщения:
    89
    Симпатии:
    0
    о strip-tags в курсе, совсем без них нельзя :)