Здравствуйте. Код (PHP): $h1 = substr_count($content, '<h1'); $c = 0; while ( $c < $h1 ) { $content = preg_replace( '/<h1(.*|)>(.*[^<a name].*)<\/h1>/', '<h1$1>$2<a name="h1-'.$c.'"></a></h1>', $content, 1 ); $c++; } Необходимо, чтобы во все теги h1, в переменной $content, добавлялись теги a с параметрами name со значениями, определёнными в цикле. Из вышеприведённого кода, думаю, не составит труда понять что мне нужно. Должно происходить следующее: Код (Text): <h1>Задача<h1> Должно заменяться на: Код (Text): <h1>Задача <a name="h1-0"></a> </h1> После чего, в этом же выполнении, должно заменяться: Код (Text): <h1>Решение</h1> На Код (Text): <h1>Решение <a name="h1-1"></a> </h1> Но происходит: Код (Text): <h1>Задача</h1> <h1>Решение</h1> Заменяется на: Код (Text): <h1>Задача <a name="h1-0"></a> <a name="h1-1"></a> </h1> <h1>Решение</h1> Подскажите, пожалуйста, как решить эту задачу? Чтобы на выходе получилось: Код (Text): <h1>Задача <a name="h1-0"></a> </h1> <h1>Решение <a name="h1-1"></a> </h1>
Убрал из цикла: Код (PHP): $content= preg_replace( '/<h1(.*|)>(.*)<\/*h1>/', '<h1$1>$2<a name="h1-0"></a></h1>', $content, 1 ); $content= preg_replace( '/<h1(.*|)>(.*)[^<a].*<\/h1>/', '<h1$1>$2<a name="h1-1"></a></h1>', $content, 1 ); Не получается. Нужно научиться пользоваться регулярными выражениями, очевидно.
Код (PHP): $content=' <h1>Задача</h1> <h1>Решение</h1>'; $h1 = substr_count($content, '<h1'); $c = 0; while ( $c < $h1 ) { $content = preg_replace( '/(<h1[^>]*>[^<]*)(<\/h1>)/i', '$1<a name="h1-'.$c.'"></a>$2', $content, 1 ); $c++; } или так Код (PHP): $content=' <h1>Задача</h1> <h1>Решение</h1>'; function h_replace_cb($str) { static $i = -1; ++$i; return $str[1] . '<a name="h1-' . $i . '"></a>' . $str[2]; } echo preg_replace_callback( '/(<h1[^>]*>[^<]*)(<\/h1>)/i', "h_replace_cb", $content );
Спасибо! Второй пример ещё не смог осилить, пока первого достаточно, но, скорей всего preg_replace_callback как раз то что надо. Меня интересует исключение конкретно [^a\sname], чтобы обходить форматирование текста в заголовках, например: Код (Text): <h1 style="text-align:center;"><span style="font-weight: bold">Задача</span></h1> Но исключение такого рода не срабатывает. В случае <h1 style="text-align:center;"> Ваше wolfram решение справляется, для меня удивительно.
Еще как вариант Код (PHP): $content=' <h1 style="text-align:center;"><span style="font-weight: bold">Задача</span></h1> <h1>Решение</h1>'; function h_replace_cb($str) { static $i = -1; ++$i; return $str[1] . $str[2] . '<a name="h1-' . $i . '"></a>' . $str[3]; } echo preg_replace_callback( '/(<h1.*>)(.*)(<\/h1>)/i', "h_replace_cb", $content ); должно работать
можно чуть упростить Код (PHP): function h_replace_cb($str) { static $i = 0; return '<a name="h1-' . $i++ . '"></a>' . $str[0]; } echo preg_replace_callback('/<\/h1>/i', 'h_replace_cb', $content);
Код (Text): <h1><span style="font-weight: bold">Задача</span> <a name="h1-0"></a> <a name="h1-1"></a> </h1> <h1>Решение</h1> Если будет Код (Text): $content=' <h1><span style="font-weight: bold">Задача</span></h1> <h1>Решение</h1>'; Вообще ничего не произойдёт, я почему и удивился что [^<]* хорошо заменяет (?:.*|).
а зачем вообще привязываться к открывающему тегу <h1> если вам нужно просто дописать перед закрывающим.
Действительно. Не заметил. Задача с нерабочим исключением [^a>] не решена. Работает лишь '/[^>]<\/h1>/i', почему не срабатывает '/[^a>]<\/h1>/i' ?