正则表达式匹配php标签内没有变量的双引号字符串

Har*_*air 5 php regex html-parsing

基本上我需要一个正则表达式来匹配PHP标签内的所有双引号字符串,而不包含变量.

这是我到目前为止所拥有的:

"([^\$\n\r]*?)"(?![\w ]*')
Run Code Online (Sandbox Code Playgroud)

并替换为:

'$1'
Run Code Online (Sandbox Code Playgroud)

但是,这也会匹配PHP标记之外的内容,例如HTML属性.

示例案例:

<a href="somelink" attribute="value">Here's my "dog's website"</a>
<?php
    $somevar = "someval";
    $somevar2 = "someval's got a quote inside";
?>
<?php
    $somevar3 = "someval with a $var inside";
    $somevar4 = "someval " . $var . 'with concatenated' . $variables . "inside";
    $somevar5 = "this php tag doesn't close, as it's the end of the file...";
Run Code Online (Sandbox Code Playgroud)

它应该匹配并替换"应该用a 替换的所有地方',这意味着理想情况下应该保留html属性.

替换后的输出示例:

<a href="somelink" attribute="value">Here's my "dog's website"</a>
<?php
    $somevar = 'someval';
    $somevar2 = 'someval\'s got a quote inside';
?>
<?php
    $somevar3 = "someval with a $var inside";
    $somevar4 = 'someval ' . $var . 'with concatenated' . $variables . 'inside';
    $somevar5 = 'this php tag doesn\'t close, as it\'s the end of the file...';
Run Code Online (Sandbox Code Playgroud)

能够匹配内部脚本标签也很棒......但是这可能会推动它进行一次正则表达式替换.

我需要一个正则表达式方法,而不是PHP方法.假设我在文本编辑器或JavaScript中使用regex-replace来清理PHP源代码.

Jon*_*ell 6

TL;博士

对于正则表达式来说,这实在是太复杂了.特别是不是一个简单的正则表达式.你可能有更好的运气嵌套正则表达式,但你真的需要lex/parse来找到你的字符串,然后你可以使用正则表达式对它们进行操作.

说明

您可以或许能做到这一点.您可以或许甚至能做到这口井,甚至完美.但这并不容易.这将非常困难.

考虑一下:

Welcome to my php file. We're not "in" yet.

<?php
  /* Ok. now we're "in" php. */

  echo "this is \"stringa\"";
  $string = 'this is \"stringb\"';
  echo "$string";
  echo "\$string";

  echo "this is still ?> php.";

  /* This is also still ?> php. */

?> We're back <?="out"?> of php. <?php

  // Here we are again, "in" php.

  echo <<<STRING
    How do "you" want to \""deal"\" with this STRING;
STRING;

  echo <<<'STRING'
    Apparently this is \\"Nowdoc\\". I've never used it.
STRING;

  echo "And what about \\" . "this? Was that a tricky '\"' to catch?";

  // etc...
Run Code Online (Sandbox Code Playgroud)

忘记在双引号字符串中匹配变量名.你可以匹配这个例子中的所有字符串吗?对我来说,这看起来像是一场噩梦.SO的语法突出显然肯定不知道如何处理它.

您是否认为变量可能也出现在heredoc字符串中?

我不想考虑正则表达式检查是否:

  1. 内部<?php<?=代码
  2. 不在评论中
  3. 在引用的报价内
  4. 什么类型的报价?
  5. 这是那种类型的引用吗?
  6. 它前面是\(转义)吗?
  7. \逃脱?
  8. 等等...

摘要

你可以为此写一个正则表达式.你可以用一些反向引用和大量的时间和关心来管理.它会很难,你可能会浪费很多时间,如果你需要修复它,你就不会理解你写的正则表达式了.

也可以看看

这个答案.这很值得.


hek*_*mgl 5

这是一个利用tokenizer扩展preg_replace仅应用于PHP字符串的函数:

function preg_replace_php_string($pattern, $replacement, $source) {
    $replaced = '';
    foreach (token_get_all($source) as $token) {
        if (is_string($token)){
            $replaced .= $token;
            continue;
        }
        list($id, $text) = $token;
        if ($id === T_CONSTANT_ENCAPSED_STRING) {
            $replaced .= preg_replace($pattern, $replacement, $text);
        } else {
            $replaced .= $text;
        }
    }
    return $replaced;
}
Run Code Online (Sandbox Code Playgroud)

为了达到你想要的效果,你可以这样称呼它:

<?php
    $filepath = "script.php";
    $file = file_get_contents($filepath);
    $replaced = preg_replace_php_string('/^"([^$\{\n<>\']+?)"$/', '\'$1\'', $file);
    echo $replaced;
Run Code Online (Sandbox Code Playgroud)

作为第一个参数传递的正则表达式是此处的键.它告诉函数只将字符串转换为单引号等价物,如果它们不包含$ (嵌入变量"$a"),{ (嵌入变量类型2 "{$a[0]}"),新行<>(HTML标记结束/打开符号).它还检查字符串是否包含单引号,并防止替换以避免需要转义的情况.

虽然这是一个PHP解决方案,但它是最准确的.您可以使用任何其他语言获得的最接近的语言要求您在某种程度上使用该语言构建自己的PHP解析器,以使您的解决方案准确无误.

  • 你打算用什么语言? (2认同)