Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多个preg_替换规则_Php_Preg Replace - Fatal编程技术网

Php 多个preg_替换规则

Php 多个preg_替换规则,php,preg-replace,Php,Preg Replace,我有5个字符串文本(在.txt文件中): 我需要php脚本,它只输出: New look - New Design New look - New Design New link - New Creation 我有这个脚本,但它有两个问题: 1) 它只适用于一种类型的字符串-文本为{BALOONS}; 2) 它只输出“新设计”,但我需要“新外观-新设计” 谢谢 如果您的模式不正确,您可以尝试以下操作 $src = '{BANANAS} 2015/02/03 16:10 - Ol

我有5个字符串文本(在.txt文件中):

我需要php脚本,它只输出:

New look - New Design
New look - New Design
New link - New Creation
我有这个脚本,但它有两个问题:

1) 它只适用于一种类型的字符串-文本为{BALOONS}; 2) 它只输出“新设计”,但我需要“新外观-新设计”



谢谢

如果您的模式不正确,您可以尝试以下操作

$src        = '{BANANAS} 2015/02/03 16:10 - Old look - Old Design
              {BALOONS} 2015/02/03 16:23 - New look - New Design
              {ORANGES} 2015/02/03 16:30 - Old look - Old Design
              {BALOONS} 2015/02/03 16:50 - New look - New Design
              {CARS} 2015/02/03 16:55 - New link - New Creation';
$pattern    = '#\{[A-Z]+\} [0-9]{4,4}/[0-9]{2,2}/[0-9]{2,2} [0-9]{2,2}:[0-9]{2,2} - (New [A-Za-z]+ - New [A-Za-z]+)#';

preg_match_all($pattern, $src, $matches);
print_r ($matches);
输出

Array
(
    [0] => Array
        (
            [0] => {BALOONS} 2015/02/03 16:23 - New look - New Design
            [1] => {BALOONS} 2015/02/03 16:50 - New look - New Design
            [2] => {CARS} 2015/02/03 16:55 - New link - New Creation
        )

    [1] => Array
        (
            [0] => New look - New Design
            [1] => New look - New Design
            [2] => New link - New Creation
        )

)

要将示例中的每一行与架构匹配并仅返回所需字符串,只能使用一种模式:

$pattern = '
~
    ^           # start of line
    {\w+}       # any word character wrapped by curly brackets
    \s\S+       # space followed by one or more Not-spaces
    \s\S+       # space followed by one or more Not-spaces
    \s-\s       # space-dash-space
    (           # --First match group:
    New\s\w+    #   ‘New’ followed by space and one or more word chars
    \s-\s       #   space-dash-space
    New\s\w+    #   ‘New’ followed by space and one or more word chars
    )           # --END First match group
    \s*         # one-or-more spaces (you can remove this, I think)
    $           # end of line
~mx
';

/* Usage: */
preg_match_all( $pattern, $string, $matches );
echo implode( PHP_EOL, $matches[1] ) . PHP_EOL;
将打印:

新外观-新设计
新外观-新设计
新链接-新创建

相反,如果您想检索“新事物”的任何出现,而不考虑您在该行中的位置,您可以使用以下方法:

$pattern = '
~
    (              # --First match group:
     (             #   --Second match group:
      (New\s\w+)   #     --3rd match group: ‘New’ followed by space and one-or-more word chars
      (\s-\s)?     #     --4st match group: optional space-dash-space
     )+            #   --END Second match group (repeating one-or-more)
    )              # --END First match group
~mx
';

/* Usage: */
preg_match_all( $pattern, $string, $matches );
echo implode( PHP_EOL, $matches[0] ) . PHP_EOL;

您可能希望搜索变量,而不是固定字符串。为此,只需将
New
替换为
{$variable}
,如本例所示:

$find = 'Old';
$pattern = "~^{\w+}\s\S+\s\S+\s-\s({$find}\s\w+\s-\s{$find}\s\w+)\s*$~m";
//                                 -------          -------
(上面的模式与第一个示例相同,在一行中)

编辑: 要将上述模式应用于原始
foreach
中的每一行,只需删除第一个匹配组,您的
preg\u replace
即可:

$pattern = '~^{\w+}\s\S+\s\S+\s-\s+~';  // no multiline option needed
echo preg_replace( $pattern, '', $line ) . '<br><br>;
$pattern='~^{\w+}\s\s+\s+\s-\s+~';//不需要多行选项
echo preg_replace($pattern,,$line)。'


我使用“if(strpos($line,$search)!==false | | strpos($line,$search2)!==false)”并输出包含$search和$search2的所有内容,去掉了带有“old”的字符串。我需要的脚本只带走部分“{*}*/*/***:*-”并留下所有文本,即以下内容。我相信,问题只在于美元模式。我需要用php语言说出这个“{*}*/*/***:*-”。@GIND第一个例子不是你想要的吗?看到了吗。。。我不能那样做,因为信息一直在更新。我的代码没问题,我只需要代码中的一个字符串,thad说-“{*}*/*/***:*-”,排除它,并重复所有其余的:)
$find = 'Old';
$pattern = "~^{\w+}\s\S+\s\S+\s-\s({$find}\s\w+\s-\s{$find}\s\w+)\s*$~m";
//                                 -------          -------
$pattern = '~^{\w+}\s\S+\s\S+\s-\s+~';  // no multiline option needed
echo preg_replace( $pattern, '', $line ) . '<br><br>;