Регулярные выражения - то работают, то нет

verstk

Новичок
Регулярные выражения - то работают, то нет

Помогите решить простую задачку:
нужно удалить все содержимое html-страницы до последовательности символов 'padding-left:10px"><b>' включительно.

Пробую:
echo 'htmlspecialchars(preg_replace('/^(.|\s){0,}('.preg_quote('padding-left:10px"><b>').'){1}/', "",$fcontents))';
Не работает :((

Стал разбираться и обнаружил интересную вещь:

preg_replace('/^(.|\s){0,}(a){1}/', "",$fcontents); - работает, а
preg_replace('/^(.|\s){0,}(с){1}/', "",$fcontents); - не работает.

preg_replace('/^(.|\s){0,}(html){1}/', "",$fcontents); - работает,
preg_replace('/^(.|\s){0,}(left){1}/', "",$fcontents); - не работает.

Разумеется и 'c' и 'left' в тексте присутствуют. Откуда взялась такая избирательность???

Спасибо!
 

SiMM

Новичок
> echo 'htmlspecialchars(preg_replace('/^(.|\s){0,}('.preg_quote('padding-left:10px"><b>').'){1}/', "",$fcontents))';
PHP Parse error: parse error
PS: не надо постить в форум чушь собачью, которая к реальному коду не имеет никакого отношения. Это как минимум невежливо.
 

verstk

Новичок
Сорри, вот код, который я хотел поместить:

echo htmlspecialchars(preg_replace('/^(.|\s){0,}('.preg_quote('padding-left:10px"><b>').'){1}/', "",$fcontents));
 

SiMM

Новичок
PHP:
$fcontents = <<<HTML
нужно удалить все содержимое html-страницы до последовательности символов 'padding-left:10px"><b>' включительно.
HTML;
echo htmlspecialchars(preg_replace('/^(.|\s){0,}('.preg_quote('padding-left:10px"><b>').'){1}/', "",$fcontents));
Код:
' включительно.
И что здесь не так? Удалилось? Удалилось. Другое дело в регулярнике есть лишнее - но погоды оно не делает.
 

verstk

Новичок
2 SiMM - нет не удалилось, страница осталась без изменений

2 Andreika - \s нужен, чтобы пробросить не только символы, но и окончания строк. Искомая комбинация находится не в первой строке

-~{}~ 10.11.05 14:48:

А кто-нибудь знает, почему

preg_replace('/^(.|\s){0,}(a){1}/', "",$fcontents); - работает, а
preg_replace('/^(.|\s){0,}(с){1}/', "",$fcontents); - не работает

Т.е. от начала документа до 'a' ищется, а до 'c' нет.
Ведь это же очень странно. Может, поэтому и не работает мой пример, хотя у SiMMа, как я понял, все заработало.

В чем тут может быть дело?

Спасибо!
 

Andreika

"PHP for nubies" reader
verstk
дело в том, что его пример заработал не только у него... мож ты поделишся данными, на которых (a) работает, а (с) нет ?
 

SiMM

Новичок
> А кто-нибудь знает, почему
> preg_replace('/^(.|\s){0,}(a){1}/', "",$fcontents); - работает, а
> preg_replace('/^(.|\s){0,}(с){1}/', "",$fcontents); - не работает
Кто ж знает, что у вас в $fcontents находится и почему у вас в первом случае используется символ латиницы, а во-втором - символ кириллицы?
 

verstk

Новичок
Вот код:

$fcontents=implode ('', file ('http://netz.ru/comments.php?id=P4431_0_1_0_C'));

echo '<pre>'.htmlspecialchars(preg_replace('/^(.|\s){0,}(c){1}/', "",$fcontents)).'</pre>';

Не работает, хотя там 'c' очень много, с 'а' все ок.
 

_RVK_

Новичок
verstk
Для начала объясни для чего следующие конструкции:
(.|\s)
{0,}
(c) - (почему в скобочках?)
{1}
 

verstk

Новичок
(.|\s) - это любые символы в том числе окончания строк
{0,} - должны встретиться сколько угодно раз или ни одного
Вообще, вот этим ^(.|\s){0,} я хотел сказать, что любая последовательность сиволов от начала $fcontents.

(c) в скобочках, возможно они и не нужны и {1}, наверное тоже.

В общем я хочу, чтобы удалялось все от начала, до символа 'c' включительно. Наверное, это можно как-то проще записать.

Код исправил на:
$fcontents=implode ('', file ('http://netz.ru/comments.php?id=P4431_0_1_0_C'));
echo '<pre>'.htmlspecialchars(preg_replace('/^(.|\s){0,}c/', "",$fcontents)).'</pre>';

Все равно на символ 'c' не реагирует, а если заменить c на a, то все работает.
 

_RVK_

Новичок
Вообще, вот этим ^(.|\s){0,} я хотел сказать, что любая последовательность сиволов от начала
^.*

(c) в скобочках, возможно они и не нужны и {1}, наверное тоже
Точно!

Все равно на символ 'c' не реагирует
Уверен что набирал в той раскладке?
 

verstk

Новичок
Если ^(.|\s){0,} заменить на ^.* , то замена происходит только в первой строке, а у меня их несколько.

Раскладка не причем, я уверен, q, например, тоже не работает

echo '<pre>'.htmlspecialchars(preg_replace('/^(.|\s){0,}left/', "",$fcontents)).'</pre>'; - НЕ работает

echo '<pre>'.htmlspecialchars(preg_replace('/^(.|\s){0,}html/', "",$fcontents)).'</pre>'; - работет

Так же не должно быть, в чем тут может быть дело?
 

_RVK_

Новичок
о замена происходит только в первой строке, а у меня их несколько
Модификатор s

-~{}~ 10.11.05 17:27:

^(.|\s){0,} - и убери эту глупость! я тебе показал как правильно.
 

verstk

Новичок
Заработало!!!
Вот так получилось:
echo '<pre>'.htmlspecialchars(preg_replace('/^.*'.preg_quote('padding-left:10px"><b>').'/s', "",$fcontents)).'</pre>';

Значит дело было действительно в этой ерунде ^(.|\s){0,}
Спасибо большое всем - вы мне очень помогли
 

verstk

Новичок
А как лучше? Перебирать построчно весь html-документ и искать нужную комбинацию?

Что-то мне кажется, что в этом случае регулярные выражения удобней.
 
Сверху