Php Regex将取代reg商标

Php Regex将取代reg商标,php,html,regex,preg-replace,symbols,Php,Html,Regex,Preg Replace,Symbols,我需要一些关于regex的帮助: 我得到了一个html输出,我需要用 我不能在title和alt属性中插入标记,显然我不需要包装已经上标的reg 以下正则表达式匹配不属于HTML标记的文本: (?<=^|>)[^><]+?(?=<|$) (?)[^>我真的会使用HTML解析器来代替正则表达式,因为HTML不是正则的,并且会呈现出比您想象的更多的边缘情况(忽略您在上面识别的上下文限制) 你不能说你在使用什么技术。如果你发布了这些技术,毫无疑问有人会推荐合适的解析器。

我需要一些关于regex的帮助:

我得到了一个html输出,我需要用

我不能在title和
alt
属性中插入
标记,显然我不需要包装已经上标的reg

以下正则表达式匹配不属于HTML标记的文本:

(?<=^|>)[^><]+?(?=<|$)

(?)[^>我真的会使用HTML解析器来代替正则表达式,因为HTML不是正则的,并且会呈现出比您想象的更多的边缘情况(忽略您在上面识别的上下文限制)


你不能说你在使用什么技术。如果你发布了这些技术,毫无疑问有人会推荐合适的解析器。

正则表达式不足以满足你的需要。首先你必须编写代码来识别内容是属性值还是元素的文本节点。然后你必须遍历所有内容并使用一些替换方法。我不确定它在PHP中是什么,但在JavaScript中它看起来像:

content[i].replace(/\&reg;/g, "<sup>&reg;</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('#&reg;(?!\s*</sup>|[^<]*>)#','<sup>&reg;</sup>', $s);
echo preg_替换('#®;(?!\s*|[^)'#','®;',$s);
背后的逻辑是:

  • 我们只替换后面没有和的®
  • 在没有打开simbol

  • 明白你的意思了…;)我正在做一个drupal(php)项目…我必须只使用“开箱即用”“东西…这就是为什么我要找一个正则表达式…这样我就可以在preg_替换中使用它作为模式…:/多谢各位!我将为我的案例采用此解决方案…但我感谢大家的建议…关于它的任何其他信息我都会让你们知道的!谢谢!!!
    content[i].replace(/\&reg;/g, "<sup>&reg;</sup>");
    
    $regex = '/(<sup>&reg;<\/sup>|<.*?>)/i';
    $original = '<div>asd&reg; asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;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&reg; asdasd. asd
        [2] => <sup>&reg;</sup>
        [3] => asd
        [4] => <img alt="qwe&reg;qwe" />
        [5] => </div>
    )
    */
    
    foreach ($tokens as &$token)
    {
        if ($token[0] == "<") continue; // Skip tokens that are tags
        $token = substr_replace('&reg;', '<sup>&reg;</sup>');
    }
    
    $tokens = join("", $tokens); // reassemble the string
    // $tokens => "<div>asd<sup>&reg;</sup> asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;qwe" /></div>"
    
    echo preg_replace('#&reg;(?!\s*</sup>|[^<]*>)#','<sup>&reg;</sup>', $s);