刚刚找到了一行解决方案:
JS:
function addSpans($string){
str.replace(/[^<>]+(?=<[^<>]+>)|[^<>]+$/g, (text) => {return "<span>"+text+"</span>";})
}
PHP:
function addSpans($input){
return preg_replace("/[^<>]+(?=<[^<>]+>)|[^<>]+$/","<span>$0</span>",$input);
}
它是如何工作的:
[^<>]+(?=<[^<>]+>)|[^<>]+$ 匹配任何匹配 [^<>]+(?=<[^<>]+>) 或匹配 [^<>]+$ 的字符串
[^<>]+(?=<[^<>]+>): 任何字符串后跟一个 html 标签
[^<>]+ 匹配一个或多个不是
的字符
(?=<[^<>]+>) 匹配 后跟 >。这匹配任何 html 标签
[^<>]+$: 输入末尾没有html标签的任何字符串
[^<>]+$ 与[^<>]+ 相同,但在输入的末尾
要在 JS 中添加 span 标签,您必须传递一个函数,该函数将匹配的字符串作为输入,作为替换。
在 PHP 中,您可以使用 $0-99 在替换中引用匹配的字符串,其中 $0 是匹配整个模式的字符串。
找不到使用正则表达式的单行方法,但此功能应该可以工作。
JS代码:
function addSpans($string){
text = $string.split(/<[^>]+>/g);
tags = $string.match(/<[^>]+>/g);
retvar = "";
for(i = 0; i < text.length;i++){
if(typeof text[i] !== 'undefined' && text[i].length > 0){
retvar += "<span>"+text[i]+"</span>";
}
if(typeof tags[i] !== 'undefined'){
retvar += tags[i];
}
}
return retvar;
}
PHP 代码:
function addSpans($input){
$text = preg_split('/<[^>]+>/',$input);
$tags = array();
preg_match_all('/<[^>]+>/',$input,$tags);
$retvar = "";
for($i = 0; $i < count($text);$i++){
if(isset($text[$i]) && strlen($text[$i]) > 0){
$retvar .= "<span>".$text[$i]."</span>";
}
if(isset($tags[0][$i])){
$retvar .= $tags[0][$i];
}
}
return $retvar;
}
代码是这样工作的:
1.: 用 HTML 标签分割字符串
正则表达式的工作原理:
< 匹配字符
[^>]+ 匹配一个或多个不是 >(关闭 html 标记)的字符
> 匹配字符 >(关闭 html 标记)
2.: 获取 HTML 标签。相同的正则表达式,但现在用于匹配而不是拆分
3.: 在循环中:
3.1:如果当前文本不为空,则用 span 标签包围当前文本(就像输入以标签开始/结束一样)
3.2:再次添加用于分割的HTML标签。
3.3:重复下一个文本和下一个 html 标记。
4.: 最终返回组合字符串。
我还会检查两个代码中是否存在当前文本/标签,以防它们的长度不同。