php 正则匹配反向引用,php正则表达式子模式的反向引用学习笔记

需要用正则表达式获取字符串的标题。标题标签是h1~h6。

使用正则表达式:"@(.*?)@"或者'(.*?)@'。使用了@作为分隔符,注意单双引号的差别\\1与\1.

例1

代码如下 复制代码

$str='

php php php php php php1

php php php php php php2

php php php php php php3

php php php php php php4
';

preg_match_all("@(.*?)@",$str,$all);

print_r($all);

?>

结果

Array

(

[0] => Array

(

[0] =>

php php php php php php1

[1] =>

php php php php php php2

[2] =>

php php php php php php3

[3] =>

php php php php php php4

)

[1] => Array

(

[0] => 1

[1] => 2

[2] => 3

[3] => 4

)

[2] => Array

(

[0] => php php php php php php1

[1] => php php php php php php2

[2] => php php php php php php3

[3] => php php php php php php4

)

)

例2

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

功能

在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。

replacement可以包含\\n形式或$n形式的逆向引用,n可以为0到99,\\n表示匹配pattern第n个子模式的文本,\\0表示匹配整个pattern的文本。

子模式

$pattern参数中被圆括号括起来的正则表达式,子模式的数目即从左到右圆括号的数目。(pattern即模式)

例1:最简单最有用的例子是确定文字中连续出现两个相同单词的位置

代码如下 复(www.111cn.net)制代码

$string = "Is is the cost of of gasoline going up up";

$pattern = "/\b([a-z]+) \\1\b/i"; //这里的\\1不能使用\$1或$1

$str = preg_replace($pattern, "\\1", $string); //这里的\\1可以使用\$1或$1,引用第一个子匹配

echo $str; //效果是Is the cost of gasoline going up

?>

例中的子表达式就是圆括号内的项。\b匹配单词的开始或结束。+匹配重复一次或更多次。

该子表达式匹配的是一个或多个字母字符的单词,即由'[a-z]+'匹配的。

该正则表达式的第二部分是对前面所捕获的子匹配的引用,也就是由附加表达式所匹配的第二次出现的单词,用'\\1'来引用第一个子匹配,第一个\是转义符。

i是正则表达式中的修正符。i:忽略大小写。

例3:

正则表达式的逆向引用($0-99或\\0-99)和子模式以(/()/)开始。

这里$0是全部匹配模式的匹配项。$1是第1个子匹配,$2至$99依次是第2个至第99个子匹配。

用$1-99后向引用子匹配时,如果后面的字符是数字,要用花括号区别开。例:${1}1 。

代码如下 复制代码

$string = "{April 15, 2003}";

//'w'匹配字母、数字和下划线,'d'匹配0-99数字,'+'匹配重复一次或更多次。

$pattern = "/{(\w+) (\d+), (\d+)}/i"; //在字符串中要搜索的匹配项

$replacement1 = "\${1}1,\$3";

$replacement2 = "\$0";

$replacement3 = "\$1";

$replacement4 = "\$2";

$replacement5 = "\$3";

echo "
";

//字符串被替换为与第n个被捕获的括号内的子模式所匹配的文本

print preg_replace($pattern, $replacement1, $string);

echo "
";

print preg_replace($pattern, $replacement2, $string);

echo "
";

print preg_replace($pattern, $replacement3, $string);

echo "
";

print preg_replace($pattern, $replacement4, $string);

echo "
";

print preg_replace($pattern, $replacement5, $string);

echo "
";

//一般表现形式

print preg_replace("/\w+/i","j",$string);

?>

效果:

April1,2003

{April 15, 2003}

April

15

2003

{j j, j}

测试已通过。

from:

http://www.111cn.net/phper/210/55602.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值