php 将段落标记中的第一个字母换行到跨度标记中

edqdpe6u  于 2023-05-05  发布在  PHP
关注(0)|答案(7)|浏览(167)

下面是一个例子:

$str = '<p>"bla" bla</p>';
$search = '_^<p> *([\w])(.+) *</p>$_i';
$replacement = '<p><span class="first_letter">$1</span>$2</p>';

$new = preg_replace( $search, $replacement, $str );

echo $new."\n";

它工作得很好。但是如果给定的字符串以某种特殊字符开头,比如“,”,它将删除它。示例$str = '<p>bla bla</p>';
总之,我想把第一个字母放在这个<span>(上面给出的)。

tjvv9vkg

tjvv9vkg1#

未测试,但尝试添加\W(大写W),它匹配非单词字符,而不是匹配搜索字符串中的零个或多个空格。这应该与你的第一个字母相匹配。

$search = '_^<p>\W*([\w])(.+) *</p>$_i';

编辑:包含特殊字符
把它放在括号中以捕获它

$search = '_^<p>(\W*)([\w])(.+) *</p>$_i';

或者作为完整的代码

$str = '<p>"bla" bla</p>';
$search = '_^<p>(\W*)([\w])(.+) *</p>$_i';
$replacement = '<p>$1<span class="first_letter">$2</span>$3</p>';

$new = preg_replace( $search, $replacement, $str );

echo $new."\n";
gzszwxb4

gzszwxb42#

我通常会直接回答问题,而不会胡乱猜测,但看起来你的代码最有可能的用途是对段落的第一个字母进行样式化。你可以这样做(使用所谓的伪类):

p:first-letter
{ 
    font-size:200%;
    color:#8A2BE2;
}

:first-letter伪元素 * Specs*。

f5emj3cl

f5emj3cl3#

如果你想保留这些特殊的字符,你可以使用下面的方法。我测试了一下。

$search = '_^<p>([\W]*)([\w])(.+) *</p>$_i';
$replacement = '<p>$1<span class="first_letter">$2</span>$3</p>';

这与你的例子。

r1zhe5dt

r1zhe5dt4#

<?php
$str = '<p style="bla">"Great!
</P>';
$str = preg_replace( '~(<p.*?>\W*?)(\w)(.*?</p>)~is', "$1<span>$2</span>$3", $str);
echo $str;
zzzyeukh

zzzyeukh5#

还有一种方法可以完成-http://ideone.com/v5KvL

<?php
  $str = '<p>"bla" bla</p>';

  $new = preg_replace( '~(?<=^<p>)(\W*)(\w)(?=[\s\S]*</p>$)~i',
                       '$1<span class="first_letter">$2</span>',
                       $str );
  echo $new."\n";
?>
dced5bon

dced5bon6#

如果在替换时不使用整个<p>...</p>标记,则无需担心嵌套<p>标记的问题。
此任务不需要捕获组;只需要在匹配第一个出现的单词字符之前释放开始标记和非单词字符--然后只用新的跨行字符串替换该单个字符。
代码:(Demo

$str = '<p>"bla" bla</p>';

echo preg_replace(
         '~<p>\W*\K\w~',
         '<span class="first_letter">$0</span>',
         $str
     );

请注意,关闭</p>标记不是HTML所必需的。
https://html.com/tags/p/#:~:text= The%20end%20of%20the%20paragraph,a%20blank%20line%20between%20paragraphs.
此外,不建议使用解析HTML。如果输入字符串可能有包含任何属性的<p>标记,则需要扩展模式。Regex是DOM无知的。换句话说,正则表达式不知道HTML和看起来像HTML的文本之间的区别。

mctunoxg

mctunoxg7#

我认为以下几点应该行得通;

$string[0] = "<span class="first_letter>" + $string[0] + "</span>";

相关问题