Русский язык и регулярные выражения

Segey
На сайте с 23.08.2005
Offline
404
848

Глупый вопрос, конечно. Но ничего не могу сделать, проверял раз 150 такое выражение:

preg_match("/(?<=слово <h1>)[\S]*(?=<\/h1>)/", $text, $zagolovok);

В тексте кусок, который ищем:

слово <h1>Заголовок</h1>

Т.е. ищем то что после: слово <h1>

и то что до: </h1>

И ищем: Заголовок

Но почему не ищется?

И еще вопросик. Если после </h1> таких еще штук 10 на странице после него не будет ли он до них идти?

Я попробовал так ограничить:

preg_match("/(?<=слово <h1>)[^<>]*(?=<\/h1>)/", $text, $zagolovok);

Т.е. чтобы теги туда никак не попали :confused:

Но эфект тот-же.

Brexit - уже совсем рядом. (https://about-this-model.blogspot.com/2019/03/brexit.html)
X
На сайте с 27.04.2006
Offline
70
#1
И еще вопросик. Если после </h1> таких еще штук 10 на странице после него не будет ли он до них идти?

Для того чтобы извлечь все результаты по шаблону используй функцию preg_match_all()

И еще не понял, почему [\S]*?

"\S" - насколько помню это любой непробельный символ. В твоем случае логичней поставить [^<]*

Segey
На сайте с 23.08.2005
Offline
404
#2

XCrank,

проблему я выше подробно описал, функция тут не при чем.

X
На сайте с 27.04.2006
Offline
70
#3

Пардон, не понял вопроса.

Используй модификатор шаблона U, он делает квантификаторы не жадными, чтобы шаблон захватывал все только до первого тега </h1>

P.S. И если ты ищешь то что между тегами <h1> и </h1> то тебе надо делать так:

$str = "слово <h1>Заголовок</h1>";


preg_match("/<h1>([^<]*)<\/h1>/U", $str, $res);

echo $res[1];
Segey
На сайте с 23.08.2005
Offline
404
#4

XCrank,

А почему <h1> не как группа символов?

Я такого примера нигде не видел...

Кстати не просто между тегами, там еще должно быть "слово" перед ними.

Вот еще забыл добавить. Там же в скрипте есть подобные регулярные выражения, которые прекрасно работают. Но у них условия жесче т.е. тут не перепутаешь. А заголовков эти много и уникальным там оказалось только слово перед заголовком. Вообще оно написано впритык к нему т.е. в коде все сплошной строкой идет. Вот именно в такой ситуации, когда слово это наш главный "индификатор" - ничего не ищется...

nickspring
На сайте с 29.03.2006
Offline
228
#5
Segey:
Глупый вопрос, конечно. Но ничего не могу сделать, проверял раз 150 такое выражение:
preg_match("/(?<=слово <h1>)[\S]*(?=<\/h1>)/", $text, $zagolovok);



В тексте кусок, который ищем:


Т.е. ищем то что после: слово <h1>
и то что до: </h1>
И ищем: Заголовок
Но почему не ищется?

И еще вопросик. Если после </h1> таких еще штук 10 на странице после него не будет ли он до них идти?
Я попробовал так ограничить:
preg_match("/(?<=слово <h1>)[^<>]*(?=<\/h1>)/", $text, $zagolovok);

Т.е. чтобы теги туда никак не попали 😕

Но эфект тот-же.

В какой кодировке обрабатываемый текст? Если utf-8, то нужно добавить модификатор /u

Segey
На сайте с 23.08.2005
Offline
404
#6

nickspring,

В windows-1251

nickspring
На сайте с 29.03.2006
Offline
228
#7

xCrank правильно написал ответ. Для Вашего случая, Segey, будет немного скорректировано:



$str = "слово1 <h1>Заголовок1</h1> слово2 <h1>Заголовок2</h1> слово1 <h1>Заголовок3</h1>слово2 <h1>Заголовок4</h1>";

preg_match_all("/слово1 <h1>([^<]*)<\/h1>/U", $str, $res);

print_r( $res[1]);

у меня выводит правильный ответ

Array ( [0] => Заголовок1 [1] => Заголовок3 )

Segey
На сайте с 23.08.2005
Offline
404
#8

nickspring, XCrank,

Спасибо всем :) Оба примера работают, только мой выводит все что между, а ваш все вместе т.е. и слово1 <h1>Заголово и.т.п...

p.s. Я символ переноса строки забыл. Будьте внимательны, не допускайте моих ошибок :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий