Преобразование названий в регулярное выражение PHP / отрицательный взгляд в будущее / toLowerCase - PullRequest
0 голосов
/ 20 февраля 2012

Я пытаюсь преобразовать некоторые заголовки на моих html-страницах в <h2>. Шаблон прост.

<?php
$test = "<p><strong>THIS IS A TEST</strong></p><div>And this is Random STUFF</div><p><strong>CP</strong></p>";
$pattern = "/<p><strong>([A-Z ]*?)<\/strong><\/p>/";
$replacement = "<h2>$1</h2>";
$test = preg_replace($pattern, $replacement, $test);
?>

По сути, возьмите все, что находится между <p><strong></strong></p> и которые пишутся с большой буквы. Достаточно просто, вот сложный бит.

Во-первых, мне нужно сделать одно исключение. <p><strong>CP</strong></p> не должно быть преобразовано в <h2>. Я попытался добавить ?!(CP) сразу после <p><strong>, но это не работает.

Во-вторых, мне нужно, чтобы первая буква была заглавной. Когда я использую «ucfirst» с «strtolower» в preg_replace (например: ucfirst(strtolower(preg_replace($pattern, $replacement, $test)));), он переводит все символы в строке в нижний регистр, и ucfirst не работает, так как он обнаруживает «<» как первый символ. </p>

Любые намеки или я даже иду в правильном направлении?


EDIT

Спасибо за помощь, определенно было лучше использовать preg_replace_callback. Я обнаружил, что все мои названия были более 3 символов, поэтому я добавил ограничитель. Также добавлены специальные символы. Вот мой окончательный код:

$pattern = "/<p><strong>([A-ZÀ-ÿ0-9 ']{3,}?)<\/strong><\/p>/";
$replacement = "<h2>$1</h2>";
$test[$i] = preg_replace_callback($pattern, create_function('$matches', 'return "<h2>".ucfirst(mb_strtolower($matches[1]))."</h2>";'), $test[$i]); 

1 Ответ

0 голосов
/ 20 февраля 2012

Попробуйте http://php.net/manual/de/function.preg-replace-callback.php.

Вы можете создать пользовательскую функцию, которая будет вызываться при каждом совпадении. В этой функции вы можете решить: а) не заменять СР и б) не ставить 1 доллар, а только сначала.

Надеюсь, это поможет и удачи.

...