Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式不包括<;预处理>;标签_Php_Regex_Wordpress_Replace_Pre - Fatal编程技术网

PHP正则表达式不包括<;预处理>;标签

PHP正则表达式不包括<;预处理>;标签,php,regex,wordpress,replace,pre,Php,Regex,Wordpress,Replace,Pre,我正在使用一个名为Acronyms()的WordPress插件。这个插件用它们的描述替换首字母缩略词。它使用一个PHP PREG_REPLACE函数 问题是它取代了标记中包含的首字母缩写词,我用它来表示源代码 $text = preg_replace( "|(?!<[^<>]*?)(?<![?.&])\b$acronym\b(?!:)(?![^<>]*?>)|msU" , "<acronym title=\"$fulltext\

我正在使用一个名为Acronyms()的WordPress插件。这个插件用它们的描述替换首字母缩略词。它使用一个PHP PREG_REPLACE函数

问题是它取代了
标记中包含的首字母缩写词,我用它来表示源代码

$text = preg_replace(
    "|(?!<[^<>]*?)(?<![?.&])\b$acronym\b(?!:)(?![^<>]*?>)|msU"
  , "<acronym title=\"$fulltext\">$acronym</acronym>"
  , $text
);
您能否修改此表达式,使其不会替换
标记中包含的首字母缩略词(不仅是直接的,而且是在任何时候)?可能吗

(?s)<pre[^<]*>.*?<\/pre>(*SKIP)(*F)|\b$acronym\b
PHP代码是:

<?php
$acronym = "ASCII";
$fulltext = "American Standard Code for Information Interchange";
$re = "/(?s)<pre[^<]*>.*?<\\/pre>(*SKIP)(*F)|\\b$acronym\\b/"; 
$str = "<pre>ASCII\nSometext\nMoretext</pre>More text \nASCII\nMore text<pre>More\nlines\nASCII\nlines</pre>"; 
$subst = "<acronym title=\"$fulltext\">$acronym</acronym>"; 
$result = preg_replace($re, $subst, $str);
echo $result;
$text=preg\u replace(
“|(?!)|密歇根州立大学”
,“$acronym”
,$text
);
您可以使用PCRE(也适用于PHP)告诉正则表达式引擎仅匹配不在某些分隔符内的内容:

<pre>ASCII</pre><acronym title="American Standard Code for Information Interchange">ASCII</acronym><pre>ASCII</pre>
更多文本\nASCII\n更多文本\nlines\nASCII\nlines”; $subst=“$acronym”; $result=preg_replace($re,$subst,$str); 回声$结果; 输出:

asciiascii

也可以使用
preg\u split
并将代码块作为一个组保留,只替换非代码块部分,然后将其合并为一个完整的字符串:

函数替换($s){
return str_replace(“”,““”,$s);//使用“$s”执行某些操作`
}
$text='您的文本放在这里…';
$parts=preg_split('#()#',$text,null,preg_split_NO_EMPTY | preg_split_DELIM_CAPTURE);
$text=”“;
$x=0;
foreach(部分为$v){
如果(修剪($v)==“”){
$text.=$v;
继续;
}
如果($v[0]=''){
if(preg#u匹配(“#^$#,$v,$m)){
$x=isset($m[1])&&$m[1]='/'-0:1;
}
$text.=$v;//这是一个HTML标记…
}否则{
$text.=!$x?替换($v):$v;//处理或跳过…
}
}
返回$text;

摘自。

谢谢collapsar提供的代码样式!谢谢。这适用于单行字符串。对于包含在标记中但不止一行(包含新行字符)的字符串如何?好的,正则表达式、代码、链接和程序都已更新。我用
[^进行了测试,效果非常好!非常感谢!)
function replace($s) {
    return str_replace('"', '&quot;', $s); // do something with `$s`
}

$text = 'Your text goes here...';
$parts = preg_split('#(<\/?[-:\w]+(?:\s[^<>]+?)?>)#', $text, null, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$text = "";
$x = 0;
foreach ($parts as $v) {
    if (trim($v) === "") {
        $text .= $v;
        continue;
    }
    if ($v[0] === '<' && substr($v, -1) === '>') {
        if (preg_match('#^<(\/)?(?:code|pre)(?:\s[^<>]+?)?>$#', $v, $m)) {
            $x = isset($m[1]) && $m[1] === '/' ? 0 : 1;
        }
        $text .= $v; // this is a HTML tag…
    } else {
        $text .= !$x ? replace($v) : $v; // process or skip…
    }
}

return $text;