我正在尝试优化一个,或者至少知道是否有更好的方法来实现。
这是我的输入字符串:
$str = 'Some text
spanned on
several lines
txt_to_grab1 fixed_text1 txt_to_grab2
Full line to grab
txt_to_grab3 fixed_text2 txt_to_grab4
Some text after';我试图抓住从"txt_to_grab1“到"txt_to_grab4”的线条,但只有"txt_to_grabX“和”全行抓取“。
我希望保留所有之前和之后未触及的内容(即换行),但删除我抓取的行中的行间隔(因为每一行都是一个<tr>,它将进入html表)。
Regex模式/替换-我找到匹配:
$find = "#(?<=\n)(.*?) fixed_text1 (.*?)(\n.*?\n)(.*?) fixed_text2 (.*?)(\n)#i";
$replace = '"$1" && "$2" grabbed.$3"$4" && "$5" grabbed.$6';
$find = "#(.*)(?<=\n)(.*?) fixed_text1 (.*?)(\n)(.*)(?<=\n)(.*?) fixed_text2 (.*?)(\n.*)#is";
$replace = '$1"$2" && "$3" grabbed.$4$5"$6" && "$7" grabbed.$8';问题:
所有问题都可以概括为:是否有更好/更短/更快的模式?
"#(?<=\n)(.*?)fixed_text1 (.*?)(\r?\n.*?r?\n)(.*?)fixed_text2 (.*?)(\r?\n)#i“(.*)(?<=\n)(.*?)fixed_text1 (.*?)(\r?\n)(.*)(?<=\n)(.*?)(.*?)(\r?\n.*)#is";
我真的很想解释一下正则表达式,如果你提供一些:)
发布于 2010-11-22 19:17:58
你不需要在后面找这个。只需在regex开始时使用行开始锚点,在末尾使用行尾锚(即多行模式下的^和$ )。要匹配中间的行分隔符,可以使用(?:\r\n|[\r\n]),这是三种最常见的行分隔符的常见用法:\n、\r或\r\n。
至于s修饰符(a.k.a )。“单行”或"DOT_ALL"),您也不需要这样做。它所做的就是允许点元字符匹配行分隔符以及所有其他字符,这对你没有任何好处。您希望它在到达换行时停止匹配,这样就可以将它们从捕获中排除在外。
下面是一个演示:
$pattern='#^(.*?) fixed_text1 (.*)(?:\r\n|[\r\n])(.*)(?:\r\n|[\r\n])(.*?) fixed_text2 (.*)$#im';
preg_match($pattern, $source, $m);
echo "$m[1] && $m[2] grabbed.\n";
echo "$m[3]\n";
echo "$m[4] && $m[5] grabbed.\n"; 产出:
txt_to_grab1 && txt_to_grab2 grabbed.
Full line to grab
txt_to_grab3 && txt_to_grab4 grabbed.https://stackoverflow.com/questions/4246827
复制相似问题