多个 preg_replace 条规则
Multiple preg_replace rules
我有 5 个字符串文本(在 .txt 文件中):
{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
我需要 php 脚本,它只输出:
New look - New Design
New look - New Design
New link - New Creation
我有这个脚本 - 但它有 2 个问题:
1) 它仅适用于一种类型的字符串 - 文本为 {BALOONS};
2) 它只输出 "New Design",但我需要 "New look - New Design".
<?php
$search = 'New look';
$search2 = 'New link';
$lines = file('myfile.txt');
$found = false;
foreach($lines as $line)
{
if(strpos($line, $search) !== false || strpos($line, $search2) !== false)
{
$found = true;
echo preg_replace('/{BALOONS} (.*) - /','',$line) ."<br><br>";
}
}
if(!$found)
{
echo 'No match found';
}
?>
谢谢!
你的模式不对,你可以试试
$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
)
)
要将示例中的每一行都与架构匹配,并且 return 只匹配所需的字符串,您只能使用一种模式:
$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;
将打印:
New look - New Design
New look - New Design
New link - New Creation
相反,如果您想检索任何出现的“New something”,独立于您在行中的位置,您可以使用此:
$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_replace
就会起作用:
$pattern = '~^{\w+}\s\S+\s\S+\s-\s+~'; // no multiline option needed
echo preg_replace( $pattern, '', $line ) . '<br><br>;
我有 5 个字符串文本(在 .txt 文件中):
{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
我需要 php 脚本,它只输出:
New look - New Design
New look - New Design
New link - New Creation
我有这个脚本 - 但它有 2 个问题:
1) 它仅适用于一种类型的字符串 - 文本为 {BALOONS}; 2) 它只输出 "New Design",但我需要 "New look - New Design".
<?php
$search = 'New look';
$search2 = 'New link';
$lines = file('myfile.txt');
$found = false;
foreach($lines as $line)
{
if(strpos($line, $search) !== false || strpos($line, $search2) !== false)
{
$found = true;
echo preg_replace('/{BALOONS} (.*) - /','',$line) ."<br><br>";
}
}
if(!$found)
{
echo 'No match found';
}
?>
谢谢!
你的模式不对,你可以试试
$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
)
)
要将示例中的每一行都与架构匹配,并且 return 只匹配所需的字符串,您只能使用一种模式:
$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;
将打印:
New look - New Design
New look - New Design
New link - New Creation
相反,如果您想检索任何出现的“New something”,独立于您在行中的位置,您可以使用此:
$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_replace
就会起作用:
$pattern = '~^{\w+}\s\S+\s\S+\s-\s+~'; // no multiline option needed
echo preg_replace( $pattern, '', $line ) . '<br><br>;