0

我正在尝试将我的 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>但它不起作用。

其次,我需要能够将第一个字母大写。当我在 preg_replace (例如:)上使用“ucfirst”和“strtolower”时ucfirst(strtolower(preg_replace($pattern, $replacement, $test)));,它会使字符串中的所有字符变为小写,并且 ucfirst 不起作用,因为它检测到“<”是第一个字符。

任何提示,或者我什至朝着正确的方向前进?


编辑

感谢您的帮助,使用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]); 
4

1 回答 1

0

尝试http://php.net/manual/de/function.preg-replace-callback.php

您可以创建在每次匹配时调用的自定义函数。在此函数中,您可以决定 a) 不替换 CP 和 b) 不放置 $1,而是放置 ucfirst。

希望这有帮助,祝你好运。

于 2012-02-20T17:10:04.747 回答