Php 预更换和'|';(或)不在我的正则表达式中工作

Php 预更换和'|';(或)不在我的正则表达式中工作,php,regex,preg-replace,Php,Regex,Preg Replace,我有一个像这样的字符串: [propertyname]=[value] "height"='max' propertyname和值都可以用单引号或双引号进行封装 所以我可以收到一个字符串,如下所示: [propertyname]=[value] "height"='max' 或: 只要属性名称和值都由相同类型的引号封装 我需要做的是删除引号。但仅限于属性名称和值!因为以下内容也可能是有效字符串: "blaat"="Some 'random' blaat" 最终结果应该是: blaat=

我有一个像这样的字符串:

[propertyname]=[value]
"height"='max'
propertyname
值都可以用单引号或双引号进行封装

所以我可以收到一个字符串,如下所示:

[propertyname]=[value]
"height"='max'
或:

只要
属性名称
都由相同类型的引号封装

我需要做的是删除引号。但仅限于
属性名称
!因为以下内容也可能是有效字符串:

"blaat"="Some 'random' blaat"
最终结果应该是:

blaat=Some 'random' blaat
我有下面的正则表达式,它可以工作。但它只在我检查双引号或单引号时起作用。当我尝试将它们与
|
操作符组合时,它就不再起作用了

<?php
$string = '"height"=\'something "else" in here\'';

//echo preg_replace ( '#"(.*?)"#', '$1', $string );
//echo preg_replace ( '#\'(.*?)\'#', '$1', $string );
echo preg_replace ( '#("(.*?)"|\'(.*?)\')#', '$1', $string );
?>

因此,我可以简单地执行两个
preg\u replace
调用,但考虑到regex应该能够在一个调用中处理这个问题,这是一个令人讨厌的工作


知道问题是什么吗?

您的正则表达式应该正确匹配,但您有一个问题:在“组合正则表达式”中,
$1
指的是整个匹配(因为第一组括号包含整个匹配),所以您要用匹配本身替换匹配,包括引号

("(.*?)"|\'(.*?)\')
^ ^        ^
|-+--- $1  |---- $3
  |--- $2
现在,您只需删除外圆括号:

"(.*?)"|\'(.*?)\'
 ^        ^
 |--- $1  |---- $2
但是,您有一个不同的问题:您需要将匹配项替换为
$1
$2
,这取决于正则表达式的哪一半匹配。既然你不能事先知道,那就不容易了。您可以尝试用
$1$2
替换,但我不知道PHP是否允许对未参加比赛的组进行反向引用

为了更好地安全起见,请使用可以同时处理这两种情况的正则表达式,包括引号字符串中的转义引号:

$result = preg_replace(
    '/(        # Match and capture (group 1):
     ["\']     # an opening quote character
    )          # (End of group 1).
    (          # Now match and capture (group 2):
     (?:       #  Either...
      \\\\.    #   an escaped character
     |         #  or...
      (?!\1)   #   (as long as it is not the closing quote)
      .        #   any other character.
     )*        #  Repeat as needed.
    )          # (End of group 2)
    \1         # Now match the closing quote./x', 
    '\2', $subject);

您的正则表达式应该正确匹配,但您有一个问题:在“组合正则表达式”中,
$1
指的是整个匹配项(因为第一组括号括住了整个匹配项),因此您要将匹配项替换为自身,包括引号

("(.*?)"|\'(.*?)\')
^ ^        ^
|-+--- $1  |---- $3
  |--- $2
现在,您只需删除外圆括号:

"(.*?)"|\'(.*?)\'
 ^        ^
 |--- $1  |---- $2
但是,您有一个不同的问题:您需要将匹配项替换为
$1
$2
,这取决于正则表达式的哪一半匹配。既然你不能事先知道,那就不容易了。您可以尝试用
$1$2
替换,但我不知道PHP是否允许对未参加比赛的组进行反向引用

为了更好地安全起见,请使用可以同时处理这两种情况的正则表达式,包括引号字符串中的转义引号:

$result = preg_replace(
    '/(        # Match and capture (group 1):
     ["\']     # an opening quote character
    )          # (End of group 1).
    (          # Now match and capture (group 2):
     (?:       #  Either...
      \\\\.    #   an escaped character
     |         #  or...
      (?!\1)   #   (as long as it is not the closing quote)
      .        #   any other character.
     )*        #  Repeat as needed.
    )          # (End of group 2)
    \1         # Now match the closing quote./x', 
    '\2', $subject);
使用类
[“]”]
捕获两个引号,或使用非捕获组
(?:)
避免由于括号内的原因而产生额外的捕获组:

'#"(.*?)"#'
// or
'#(?:"(.*?)"|\'(.*?)\')#'
使用类
[“]”]
捕获两个引号,或使用非捕获组
(?:)
避免由于括号内的原因而产生额外的捕获组:

'#"(.*?)"#'
// or
'#(?:"(.*?)"|\'(.*?)\')#'

只需使用字符类而不是
“#[”](.*?[”]#
。只需使用字符类而不是
“#[”](.*?[”]#
。非常感谢伟大的正则表达式:)非常感谢伟大的正则表达式:)