我有这样的:
$mytext="that's really "confusing" and <absolutly> silly";
echo substr($mytext,0,6);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,输出将是:that&#而不是that's
我想要的是将 html 实体计算为 1 个字符,然后是 substr,因为我总是在文本末尾得到损坏的 html 或一些晦涩的字符。
请不要建议我先 html 解码然后 substr 然后编码它,我想要一个干净的方法:)
谢谢
有两种方法可以做到这一点:
您可以解码 HTML 实体,substr()然后进行编码;或者
您可以使用正则表达式。
(1) 用途html_entity_decode()和htmlentities():
$s = html_entity_decode($mytext);
$sub = substr($s, 0, 6);
echo htmlentities($sub);
Run Code Online (Sandbox Code Playgroud)
(2) 可能是这样的:
if (preg_match('!^([^&]|&(?:.*?;)){0,5}!s', $mytext, $match)) {
echo $match[0];
}
Run Code Online (Sandbox Code Playgroud)
这就是说:从字符串的开头找到最多 5 次出现的前面的表达式。前面的表达式是:
任何不是&符号的字符;或者
一个 & 号,后跟任何直到并包括分号的内容(即 HTML 实体)。
这并不完美,所以我赞成(1)。