需要PHP Regex帮助

时间:2017-02-22 17:54:11

标签: php regex regex-negation

我有一些求助的请求,不像我想的那么复杂,但我无法弄明白:

这是我的正则表达式模式:

$template=@" {Content*:START-OF-DATA line1 END-OF-DATA} {Content*:START-OF-DATA line2 Line3 END-OF-DATA} "@ Get-ChildItem "C:\temp\test" -file | foreach { $Data=Get-Content $_.FullName | ConvertFrom-String -TemplateContent $template if ($Data -ne $null) { [pscustomobject]@{FullName=$_.FullName; Content=$Data} } } | Format-Table -Wrap (我通过preg_match_all()使用没有标志g)

这是要搜索的字符串(通常来自jqValidate):

/:\s*'([^:]*)'/g

这就是我想要得到的:

{ messages : { required :   'This 'asdf' "asdf" field is required!', dateISO : 'This is a test...' } , rules : { dateISO : true , required : true } }

这是问题所在:

这种模式 - 我花了好几个小时来弄清楚(我没有很好地练习) - 效果很好,但只要我不需要:(冒号)。 如果我在单引号之间的消息文本中使用冒号,则该消息不再匹配。

大多数情况下,我试图玩弄结肠的否定,但我不知道如何否定像“匹配所有出现但冒号”这样的群体,只有“它们不是由至少一个单引号和任何之间的任何东西引导”单引号和冒号“。

为了更清楚地说明我的意思:

array( 0 => array( 0 => : 'This 'asdf' "asdf" field is required!' 1 => : 'This is a test...' ) 1 => array( 0 => This 'asdf' "asdf" field is required! 1 => This is a test... ) )

Example: This is a plausible use of a colon in a jqValidate message.

'Example': We probably do not use a colon together with single quotes like this.

我希望你看,我的问题是什么。任何有用的帮助将非常感激。

提前完成,

关心英格玛

2 个答案:

答案 0 :(得分:0)

这应该有效:

正则表达式:

/(?<=required)\s:\s+\'(.+)\',|(?<=dateISO)\s:\s+\'(.+)\'/g

输入:

{ messages : { required :   'This 'asdf' "asdf" field is required!', dateISO : 'This is a test...' } , rules : { dateISO : true , required : true } }

输出:

This 'asdf' "asdf" field is required!
This is a test...

PHP代码:

<?php
$re = '/(?<=required)\s:\s+\'(.+)\',|(?<=dateISO)\s:\s+\'(.+)\'/';
$str = '{ messages : { required :   \'This \'asdf\' "asdf" field is required!\', dateISO : \'This is a test...\' } , rules : { dateISO : true , required : true } }';

preg_match_all($re, $str, $matches);

// Print the entire match result
print_r($matches);
?>

请参阅:https://regex101.com/r/UD7pgq/2

答案 1 :(得分:0)

对于那些对解决方案感兴趣的人,我在未来的时间里为自己创造了自己,这就是我如何解决它:

给定字符串是(*在您在引号中注释未转义的引号之前,请阅读我发布的结尾!):

{ messages : { required : 'This 'asdf' "asdf" field is required!', dateISO : 'This is a test...' } , rules : { dateISO : true , required : true } }

忘了这个!!!我愚弄了自己,根本不需要第1点,因为(在jqValidate的情况下)没有其他部分像“消息”那样存在,让DEV定义TEXT-IN-QUOTES!跳到第2点!!!

但当然基本原则仍然存在。

<强> / *

<击> 1。仅获取整个修剪过的字符串中的消息:

^(?:\{\s*messages\s*:\s*\{){1}(.*)(?:\}\s*,(?:.*)\}){1}$

生成的preg_match数组将包含要在索引1上使用的字符串:

<击> required : 'This 'asdf' "asdf" field is required!', dateISO : 'This is a test...'

<强> * /

  1. 勾选字符串的相应消息(这里有魔法):
  2. :\s*\'((?:(?!\'\s*,(?:.*):\s*\'(?:.*)).)+)\'

    生成的preg_match_all数组现在将包含索引为1的子数组中的 ALL 消息,您可以执行任何操作(清除,替换为'with',trim(), addslashes(),重建它,替换DB中的错误条目等等。)。

    (*)BTW:在这个系统中,管理员用户(不是开发人员)已经向数据库写了数千条jqValidate规则和消息,但是系统中没有对这样的错误条目进行验证。在我手动搜索并清理所有这些条目或者让管理员用户重写他们多年的工作之前,我选择了使用正则表达式的小小脚本来清理它的方法。 这就是正则表达式的目的......至少,我理解的方式。

    如果您对它的外观感兴趣:regex101.com

    并且:,您可以在jqValidate中使用单引号 - 只要您将其转义(例如通过addslashes()):

    Single quotes in a jqValidate message