Php Regex将取代reg商标
我需要一些关于regex的帮助: 我得到了一个html输出,我需要用Php Regex将取代reg商标,php,html,regex,preg-replace,symbols,Php,Html,Regex,Preg Replace,Symbols,我需要一些关于regex的帮助: 我得到了一个html输出,我需要用 我不能在title和alt属性中插入标记,显然我不需要包装已经上标的reg 以下正则表达式匹配不属于HTML标记的文本: (?<=^|>)[^><]+?(?=<|$) (?)[^>我真的会使用HTML解析器来代替正则表达式,因为HTML不是正则的,并且会呈现出比您想象的更多的边缘情况(忽略您在上面识别的上下文限制) 你不能说你在使用什么技术。如果你发布了这些技术,毫无疑问有人会推荐合适的解析器。
我不能在title和alt
属性中插入
标记,显然我不需要包装已经上标的reg
以下正则表达式匹配不属于HTML标记的文本:
(?<=^|>)[^><]+?(?=<|$)
(?)[^>我真的会使用HTML解析器来代替正则表达式,因为HTML不是正则的,并且会呈现出比您想象的更多的边缘情况(忽略您在上面识别的上下文限制)
你不能说你在使用什么技术。如果你发布了这些技术,毫无疑问有人会推荐合适的解析器。正则表达式不足以满足你的需要。首先你必须编写代码来识别内容是属性值还是元素的文本节点。然后你必须遍历所有内容并使用一些替换方法。我不确定它在PHP中是什么,但在JavaScript中它看起来像:
content[i].replace(/\®/g, "<sup>®</sup>");
content[i]。替换(/\®;/g,“®;”);
我同意Brian的观点,正则表达式不是解析HTML的好方法,但如果必须使用正则表达式,可以尝试将字符串拆分为标记,然后在每个标记上运行regexp
我正在使用preg\u split
分割HTML标记上的字符串,以及短语®
——这将留下不是已上标的文本®;
,或者不是作为标记的标记。然后对于每个标记,®;
可以替换为®;
:
$regex='/(®;|)/i';
$original='asd®;asdasd.asd®;asd';
//我们需要捕获标记,以便可以重建字符串
$tokens=preg_split($regex,$original,-1,preg_split_DELIM_CAPTURE | preg_split_NO_EMPTY);
/*$tokens=>Array
(
[0] =>
[1] =>asd®;asdasd.asd
[2] =>®;
[3] =>asd
[4] =>
[5] =>
)
*/
foreach($tokens as&$token)
{
如果($token[0]==”那么,如果您同意以下限制,这里有一个简单的方法:
已处理的reg在®;之后具有以下权限:
echo preg_replace('#®(?!\s*</sup>|[^<]*>)#','<sup>®</sup>', $s);
echo preg_替换('#®;(?!\s*|[^)'#','®;',$s);
背后的逻辑是:
我们只替换后面没有和的®
在没有打开simbol
明白你的意思了…;)我正在做一个drupal(php)项目…我必须只使用“开箱即用”“东西…这就是为什么我要找一个正则表达式…这样我就可以在preg_替换中使用它作为模式…:/多谢各位!我将为我的案例采用此解决方案…但我感谢大家的建议…关于它的任何其他信息我都会让你们知道的!谢谢!!!
content[i].replace(/\®/g, "<sup>®</sup>");
$regex = '/(<sup>®<\/sup>|<.*?>)/i';
$original = '<div>asd® asdasd. asd<sup>®</sup>asd <img alt="qwe®qwe" /></div>';
// we need to capture the tags so that the string can be rebuilt
$tokens = preg_split($regex, $original, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
/* $tokens => Array
(
[0] => <div>
[1] => asd® asdasd. asd
[2] => <sup>®</sup>
[3] => asd
[4] => <img alt="qwe®qwe" />
[5] => </div>
)
*/
foreach ($tokens as &$token)
{
if ($token[0] == "<") continue; // Skip tokens that are tags
$token = substr_replace('®', '<sup>®</sup>');
}
$tokens = join("", $tokens); // reassemble the string
// $tokens => "<div>asd<sup>®</sup> asdasd. asd<sup>®</sup>asd <img alt="qwe®qwe" /></div>"
echo preg_replace('#®(?!\s*</sup>|[^<]*>)#','<sup>®</sup>', $s);