【问题标题】:Pass everything exists before and after special char in php regex在 php 正则表达式中传递特殊字符之前和之后存在的所有内容
【发布时间】:2016-04-16 08:57:32
【问题描述】:

你好,这是我的字符串

data {'1' => 'anything', '2' => '5', '3' => 'anything'}
data {'1' => 'anything', '2' => '5', '3' => 'anything', '7' => 'anything'}
data {'1' => 'anything', '2' => '6', '3' => 'anything'}
data {'1' => 'anything', '5' => 'anything', '2' => '5', '3' => 'anything'}

我想使用正则表达式并获取其中存在'2' => '5' 的每一行。

这样的

数据 {之前的所有内容 ('2' => '5') 之后的所有内容}

我的问题是如何在我想要的 ('2' => '5') 之前和之后传递所有存在的东西?

这是我的正则表达式。请修复它

data\h*[{](what should i use here to pass everything exists before)[']2[']\h*[=][>]\h*[']5['](what should i use here to pass everything exists after)[}]

只要得到这行

data {'1' => 'anything', '2' => '5', '3' => 'anything'}
data {'1' => 'anything', '2' => '5', '3' => 'anything', '7' => 'anything'}
data {'1' => 'anything', '5' => 'anything', '2' => '5', '3' => 'anything'}

请修正我的正则表达式

感谢您的回答,但还有另一个问题.. 如果我的字符串是

data {'1' => 'anything
anynew line inside of 1', '2' => '5', '3' => 'anything'}
data {'1' => 'anything', '2' => '5', '3' => 'anything', '7' => 'anything'}
data {'1' => 'anything', '2' => '6', '3' => 'anything'}
data {'1' => 'anything', '5' => 'anything', '2' => '5', '3' => 'anything'}

(我在行中使用新行和'' 内的所有其他内容)它不会得到该行!!!!!!!!!!!!!我该怎么办? .* 每行中有几行时不起作用 我需要在前后获取所有内容(包括行和...)!!!

【问题讨论】:

  • 但是,如果有多个'2'='5'会怎样?
  • 试试这个.*'2' => '5'.*
  • Just get this lines - 这些是唯一带有 2=>5 的行
  • 这有一些奇怪的PHP-array-functions-builtin-odour...
  • @nerdlyist - 正则表达式非常适合这个。一个多行的字符串?覆盖.*。嵌入文字,覆盖。正则表达式是最好的解决方案。

标签: php regex


【解决方案1】:

要捕获一个或多个'key' => 'value', 部分,请使用:

((\s*'[^']*'\s*=>\s*'[^']*'\s*,\s*)*)

但是,您可以在没有完全匹配模式的情况下检查一行是否包含您的字符串:

preg_match("#'2' => '5'#", $line);

更新:如果要捕获多行文本,请使用严格匹配的模式:

$content = "data {'1' => 'anything
anynew line inside of 1', '2' => '5', '3' => 'anything'}
data {'1' => 'anything', '2' => '5', '3' => 'anything', '7' => 'anything'}
data {'1' => 'anything', '2' => '6', '3' => 'anything'}
data {'1' => 'anything', '5' => 'anything', '2' => '5', '3' => 'anything'}";

preg_match_all("#data\\s*\\{((\\s*'[^']*'\\s*=>\\s*'[^']*'\\s*,\\s*)*)\\s*'2'\\s*=>\\s*'5'\\s*((\\s*,\\s*'[^']*'\\s*=>\\s*'[^']*'\\s*)*)#", $content, $matches, PREG_SET_ORDER);

foreach ($matches as $match) {
    echo "BEFORE: " . $match[1] . "<br />";
    echo "AFTER: " . $match[3] . "<br />";
    echo "<hr />";
}

我注意到:如果您是生成此数据的人,您应该使用更好的格式。例如,JSON 流 是多行内容数据结构的一个很好的解决方案。您可以轻松找到 PHP 的 JSON 流解析器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多