PHP实现数组中MathML标签的条件式批量替换需求
解决数组中MathML标签自动添加+ 的问题
我来帮你搞定这个问题~先说说你当前代码里的几个明显问题:
- 循环里没更新
strpos的起始位置,会直接陷入无限循环; substr的参数用错了,第三个参数是截取长度不是结束位置,你得从<mrow>结束的位置(也就是$pos + 6,因为<mrow>一共6个字符)开始截取,才能判断后面是不是<mo>标签;str_replace没法按位置替换内容,得用字符串拼接的方式来插入新标签。
下面给你两种可行的解决方案,你可以根据自己的场景选:
方案一:正则表达式(简洁高效,适合简单结构)
用正则的负向前瞻断言,可以精准匹配<mrow>后面没紧跟<mo>的情况,直接替换插入需要的标签:
$addplus = [ '<mfenced><mfrac><mrow><mn>2</mn><mi>x</mi><mo>+</mo><mn>3</mn></mrow><mi>x</mi></mfrac></mfenced>', '<mfenced><mrow><mn>2</mn><mi>x</mi><mo>+</mo><mn>3</mn></mrow></mfenced>' ]; $temp = []; foreach ($addplus as $item) { // 匹配<mrow>后不跟<mo>的情况,插入<mo>+</mo> $processed = preg_replace('/<mrow>(?!<mo>)/', '<mrow><mo>+</mo>', $item); $temp[] = $processed; } print_r($temp);
这里的(?!<mo>)是负向前瞻,意思就是“只有当<mrow>后面不是<mo>的时候才匹配”,刚好符合你的需求。
方案二:DOMDocument处理(更严谨,适合复杂MathML)
如果你的MathML结构可能更复杂(比如有嵌套、空白节点之类的),用DOM解析会更可靠,不会出现正则匹配出错的情况:
$addplus = [ '<mfenced><mfrac><mrow><mn>2</mn><mi>x</mi><mo>+</mo><mn>3</mn></mrow><mi>x</mi></mfrac></mfenced>', '<mfenced><mrow><mn>2</mn><mi>x</mi><mo>+</mo><mn>3</mn></mrow></mfenced>' ]; $temp = []; foreach ($addplus as $item) { $dom = new DOMDocument(); // 忽略XML加载时的错误(避免MathML标签的兼容问题) libxml_use_internal_errors(true); $dom->loadXML($item); libxml_clear_errors(); // 找到所有<mrow>元素 $mrows = $dom->getElementsByTagName('mrow'); foreach ($mrows as $mrow) { $firstChild = $mrow->firstChild; // 跳过空白文本节点(XML解析经常会生成这些节点) while ($firstChild && $firstChild->nodeType === XML_TEXT_NODE && trim($firstChild->nodeValue) === '') { $firstChild = $firstChild->nextSibling; } // 如果第一个有效子节点不是<mo>,就插入<mo>+</mo> if ($firstChild && $firstChild->tagName !== 'mo') { $moTag = $dom->createElement('mo', '+'); $mrow->insertBefore($moTag, $firstChild); } } // 把处理后的DOM转回字符串 $temp[] = $dom->saveXML($dom->documentElement); } print_r($temp);
这两种方案运行后都能得到你想要的结果:
Array ( [0] => <mfenced><mfrac><mrow><mo>+</mo><mn>2</mn><mi>x</mi><mo>+</mo><mn>3</mn></mrow><mi>x</mi></mfrac></mfenced> [1] => <mfenced><mrow><mo>+</mo><mn>2</mn><mi>x</mi><mo>+</mo><mn>3</mn></mrow></mfenced> )
内容的提问来源于stack exchange,提问作者jai wilshere
相关产品推荐
相关产品推荐

