正则表达式在模式开始时忽略双引号来替换

时间:2018-06-18 14:54:57

标签: php regex

我在尝试使用正则表达式检测字符串模式开头的"时遇到了一些麻烦,希望你们能帮助我。

因此,我们在工作中有一个遗留应用程序,它返回一些用于为另一个应用程序生成.ini文件的文本。我没有权限改变它的生成方式所以我试图解决这个问题。

我的问题是当我去“View-source”时我们用来获取我们为.ini文件复制的数据,输出如下为3000行,每个部分包含一个变量和它的属性:

[variable73]
  name=""
  number=1
  obligatory=1
  field="input"
  type="radio"
  value[]="Case 1"
  value[]="Case 2"
  label_value[]="2"
  label_value[]="7"
  description="Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Vivamus aliquam laoreet auctor. Proin commodo eu elit ac ullamcorper. Morbi facilisis malesuada augue id semper. Pellentesque commodo felis tortor, et tincidunt sapien pulvinar vel. 

    Phasellus sed nisl sed urna hendrerit ullamcorper non sed orci. Nam nec ipsum neque. Fusce erat sapien, aliquet vitae ligula ac, vulputate dictum nunc. 

Vestibulum non turpis elit. "
  idV="Which action was chosen?"
  codV="v8973"
  orientation=""

[variable74]
  ...
  ...

我需要删除每行开头的尾随空格,以获得类似:

[variable73]
name=""
number=1
obligatory=1
field="input"
.
. 
etc

但是没有删除description变量中的空格,因为这会弄乱应该在另一个接收此.ini文件的应用程序中显示的文本。

所以我尝试了这个:

$copy_contents = file_get_contents($url);
$treated = preg_replace("/\n(^\s+[a-zA-Z\n]*?)/m", '', $copy_contents);

我得到了一些成功删除每一行的空格,但这弄乱了description,所以我尝试用信号通知结尾"和换行符作为模式的开头,并且我在regex101.com上尝试了它,它似乎抓住了正确的部分,但当我在我的代码上尝试使用:

$treated = preg_replace("/\"\n(^\s+[a-zA-Z\n]*?)/m", '', $copy_contents);

这没有做任何事情。根本没有空白空间被删除,就像在模式开始时无法检测到"一样。因为它是HTML,我尝试使用",但无论如何都不起作用。

有人能指出我的错误吗?无法找到我的正则表达式无法在输入文本中识别我的\"的原因。

提前感谢任何输入。如果你们有一个想法,我怎么能这样做而不删除每个新变量部分之间的空行,这将是伟大的。

2 个答案:

答案 0 :(得分:1)

使用以下内容: -

<?php

$copy_contents = file_get_contents("data.txt");
$treated = preg_replace("/(^\s+[\.]*?)/m", '', $copy_contents);
echo $treated;

?>

输出: -

[variable73]
name=""
number=1
obligatory=1
field="input"
type="radio"
value[]="Case 1"
value[]="Case 2"
label_value[]="2"
label_value[]="7"
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Vivamus aliquam laoreet auctor. Proin commodo eu elit ac ullamcorper. Morbi facilisis malesuada augue id semper. Pellentesque commodo felis tortor, et tincidunt sapien pulvinar vel. 
Phasellus sed nisl sed urna hendrerit ullamcorper non sed orci. Nam nec ipsum neque. Fusce erat sapien, aliquet vitae ligula ac, vulputate dictum nunc. 
Vestibulum non turpis elit. "
idV="Which action was chosen?"
codV="v8973"
orientation=""
[variable74]

答案 1 :(得分:1)

可能最简单的方法是匹配引用的值,但跳过它们 通过使用动词(*SKIP)(*FAIL)

这样,就会跳过引用的部分。

将交替包含在原子组 (?> )中非常重要 不允许忽略引用的子句以支持匹配 在报价内。

(?m)(?>"[^"]*"(*SKIP)(*FAIL)|^\h+)

https://regex101.com/r/AbhrVB/1

可读版本

 (?m)                   # Multi-line mode
 (?>                    # Atomic group, don't allow backtracking into this 
      " [^"]* "              # Bypass any quoted values. Match it but skip
      (*SKIP) (*FAIL) 
   |                       # or,
      ^ \h+                  # Match at BOL many horizontal whitespace
 )