За последние 24 часа нас посетили 51950 программистов и 1772 робота. Сейчас ищут 865 программистов ...

Регулярки

Тема в разделе "PHP для новичков", создана пользователем GutsOut, 27 мар 2014.

  1. GutsOut

    GutsOut Новичок

    С нами с:
    20 ноя 2013
    Сообщения:
    22
    Симпатии:
    0
    Здравствуте, подскажите, пожалуйста, как с помощью регулярных выражений за заменить это:
    <h1 class="MsoNormal">ПРАКТИКА ПРИМЕНЕНИЯ ТРУДОВОГО ЗАКОНОДАТЕЛЬСТВА&nbsp;</h1>
    на это
    <h2 class="rubric-title">ПРАКТИКА ПРИМЕНЕНИЯ ТРУДОВОГО ЗАКОНОДАТЕЛЬСТВА&nbsp;</h2>
     
  2. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    preg_replace('#<h1 class="MsoNormal">(.*?)</h1>#siU', '<h2 class="rubric-title">$1</h2>', $text);
     
  3. GutsOut

    GutsOut Новичок

    С нами с:
    20 ноя 2013
    Сообщения:
    22
    Симпатии:
    0
    Большое спасибо.
    Если не трудно ответьте, пожалуйста:
    1. Что значит #...#, и чем это отличается от /.../?
    2. Не могу до конца прочитать выражение (.*?) - "любое количество любых символов...", а что означает "?" ?
    3. Что означает "U";
    4.И самое интересное это - $1, я понимаю, что это то, что игнорируется при замене, но откуда это берется/присваивается, чувствую это как-то связано с "?" из п.2))
     
  4. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    1. ничем. кто как привык. главное ограничить шаблон регулярки. в моем случае если использовать / в качестве обрамления, пришлось бы экранировать <\/h1>
    2. любое колво символов до того момента, пока не попадется </h1>
    3. http://php.ru/manual/reference.pcre.pattern.modifiers.html
    4. $1 Это то что хранится в (.*?)
     
  5. GutsOut

    GutsOut Новичок

    С нами с:
    20 ноя 2013
    Сообщения:
    22
    Симпатии:
    0
    Еще раз большое спасибо
     
  6. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    не за что
     
  7. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. $str='<h1 class="MsoNormal">ПРАКТИКА ПРИМЕНЕНИЯ ТРУДОВОГО ЗАКОНОДАТЕЛЬСТВА </h1>';
    2. $str=preg_replace('~</?\Kh1(?=(?:\sclass="MsoNormal"[^<>]*)?>)~ix','h2 class="rubric-title"',$str);
    3. echo $str; 
    :D
     
  8. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Позвольте вопрос, а нахрена тут вообще регулярка? Можно же сделать без нее:
    Код (PHP):
    1. $str='<h1 class="MsoNormal">ПРАКТИКА ПРИМЕНЕНИЯ ТРУДОВОГО ЗАКОНОДАТЕЛЬСТВА </h1>';
    2. $str = str_replace(array('h1','MsoNormal'), array('h2','rubric-title') , $str);
    3. echo $str;  
     
  9. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    какова задача ) человек познал новое
     
  10. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Это круто, но в 95% случаев, когда надо именно заменить текст, достаточно str_replace. Стоит ли говорить, что он и работает быстрее и дешевле регулярок. Достаточно быстрее и дешевле, чтобы в документации было это отдельно отмечено.

    Регулярка имеет смысл, когда нужно заменить слово и его производные, например. А тут - точное совпадение. Накойчерт раскручивать регексповый движок ради такого?
     
  11. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ради забавы!
    Fell-x27, А вообще ты не прав, в тексте может быть тоже h1 и другие текста, которые может не хочу заменять. =)
     
  12. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    пф, возьми просто "<h1 class="", а не h1:) Сразу вероятность ошибки снижается оч сильно.

    З.Ы. А вообще воровать чужой контент, парсить, и выдавать за свой - зло. Эт раз. Пробежка по контенту регуляркой - отстой. Лучше разберите его на HTML-объекты и оперируйте ими. Получится куда гибче система. А то вы все равно привязаны получаетесь к чужой верстке.
     
  13. GutsOut

    GutsOut Новичок

    С нами с:
    20 ноя 2013
    Сообщения:
    22
    Симпатии:
    0
    Подскажите, пожалуйста, вот такая регулярка:
    #<div align="right"><p>([А-Я][a-я]*\s[А-Я]\.\s[А-Я]\..*?)</p></div>#

    работает при поиске:
    <div align="right"><p>Александров Г. М.&nbsp;</p></div>

    но не работает при переносе строки после дива:
    <div align="right">
    <p>Александров Г. М.&nbsp;</p></div>

    пробовал так -#<div align="right">\n<p>([А-Я][a-я]*\s[А-Я]\.\s[А-Я]\..*?)</p></div># - не помогает
     
  14. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    после #ДОБАВЬ m в конце
    я тебе ссылку показывал про модификаторы. почитай ее. не ленись
     
  15. GutsOut

    GutsOut Новичок

    С нами с:
    20 ноя 2013
    Сообщения:
    22
    Симпатии:
    0
    неа, не работает
    Почитаю обязательно, сейчас просто со временем напряг
     
  16. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    потрать 5 минут и разберись в системе, сэкономишь много времени.
     
  17. GutsOut

    GutsOut Новичок

    С нами с:
    20 ноя 2013
    Сообщения:
    22
    Симпатии:
    0
    Видимо придется, спасибо)
     
  18. GutsOut

    GutsOut Новичок

    С нами с:
    20 ноя 2013
    Сообщения:
    22
    Симпатии:
    0
    Возник опять вопрос, есть регулярка
    <p.*?align="right" class="MsoNormal">(.*?)</p>#si

    ...и кусок текста ниже. По задумке регулярка должна ловить помеченное зеленым(оно это и делает и это правильно), но почему оно еще отлавливает текст красным, который не надо ловить, я не пойму
    <p style="margin-bottom: 0.0001pt;" align="right" class="MsoNormal">Степанова М.
    И.</p>
    &nbsp;
    <h1 style="margin-bottom: 0.0001pt;" class="MsoNormal">ОБУЧЕНИЕ И
    АТТЕСТАЦИЯ ПЕРСОНАЛА</h1>
    <h2 style="margin-bottom: 0.0001pt;" class="MsoNormal">Кто
    оплачивает медосмотры работников?</h2>
    <p style="margin-bottom: 0.0001pt;" class="MsoNormal">Законно ли
    требование генерального директора об оплате работниками обязательных
    предварительных и периодических медосмотров? Обязан ли работодатель возместить
    расходы на прохождение медицинского осмотра, если гражданин, поступающий на
    работу в организацию, прошел медицинский осмотр до трудоустройства? Имеет ли
    право работодатель удерживать из заработной платы работника расходы на
    медицинский осмотр, если работник уволился, проработав менее какого-то срока
    (например, три месяца)?</p>

    <p style="margin-bottom: 0.0001pt;" align="right" class="MsoNormal">Умяров И. Г.</p>&nbsp;
    <h1 style="margin-bottom: 0.0001pt;" class="MsoNormal">ТЕХНИЧЕСКОЕ