Встал вопрос с тем, что третий карман в регулярке теряется.
Для теста беру простенькую строку:
$str = 'вхождение [h 1]заголовка[/h 1] в строку'
После чего мне нужно выловить три вхождения:
- до объявления заголовка
- заголовок
- после заголовка
Пробую делать так:
$test = preg_match('#(.*)(\[h1\].*\[\/h1\])(.*)#Ui', $str, $testar);
Важно вычленить возможность появления до и после заголовка возможные строки, вдруг забыли поставить энтер...
Результат почти как необходимо:
Array
(
[0] => вхождение [h 1]заголовка[/h 1]
[1] => вхождение
[2] => [h 1]заголовка[/h 1]
[3] =>
)
Карман найден, но содержимое потеряно... Что могло стать причиной?
ЗЫ: Пробелы между h и 1 для того чтоб заголовок не преобразовывался на форуме
Спустя 11 минут, 10 секунд (24.02.2012 - 22:33) inpost написал(а):
U - поиск не жадный, поэтому сразу обрывается.
(.*) - может быть символ, а может и не быть.
Не жадный поиск всегда будет искать наименьшее, итого от 0 до бесконечности от выберет - 0.
Карман есть, но в него идёт пустота.
Хочешь использовать в некоторых местах жадный, а в других - свободный, то
.*? - это замена обычного .* , без модификатора U на не жадный поиск
Поэтому где ты ищешь не жадную строку, пиши .*? , не смотря на это там, где тебе нужен жадный, а это КОНЕЦ строки и последний карман - там просто .* без модификатора U
(.*) - может быть символ, а может и не быть.
Не жадный поиск всегда будет искать наименьшее, итого от 0 до бесконечности от выберет - 0.
Карман есть, но в него идёт пустота.
Хочешь использовать в некоторых местах жадный, а в других - свободный, то
.*? - это замена обычного .* , без модификатора U на не жадный поиск
Поэтому где ты ищешь не жадную строку, пиши .*? , не смотря на это там, где тебе нужен жадный, а это КОНЕЦ строки и последний карман - там просто .* без модификатора U
Спустя 30 секунд (24.02.2012 - 22:33) killer8080 написал(а):
$str = 'вхождение [h 1]заголовка[/h 1] в строку';
$test = preg_match('#(.*)(\[h1\].*\[\/h1\])(.*?)#Uius', $str, $testar);
echo '<pre>'.print_r($testar,1).'</pre>';
Спустя 44 секунды (24.02.2012 - 22:34) walerus написал(а):
$str = 'вхождение <H1>заголовка</H1> в строку';
preg_match( '~^(.*)<h1>(.*)</h1>(.*)$~iUsu', $str, $match );
print_r($match);
заголовок указывается в <> скобках, а не в [].
Спустя 1 минута, 1 секунда (24.02.2012 - 22:35) killer8080 написал(а):
Цитата (walerus @ 24.02.2012 - 21:34) |
заголовок указывается в <> скобках, а не в []. |
там наверно bb-code.
Спустя 1 минута (24.02.2012 - 22:36) inpost написал(а):
killer8080
.*? при не жадном поиске - идёт обратный эффект, делается жадным, правильно? Знал это, но что-то засомневался без тестов.
.*? при не жадном поиске - идёт обратный эффект, делается жадным, правильно? Знал это, но что-то засомневался без тестов.
Спустя 1 минута, 49 секунд (24.02.2012 - 22:38) killer8080 написал(а):
Цитата (inpost @ 24.02.2012 - 21:36) |
.*? при не жадном поиске - идёт обратный эффект, делается жадным, правильно? |
совершенно верно
--удалил--
Спустя 2 минуты, 34 секунды (24.02.2012 - 22:40) Quieteroks написал(а):
Оперативно.
Всем спасибо.
Да, там действительно bb тег, а не тег.
Всем спасибо.
Да, там действительно bb тег, а не тег.