当前位置:首页 » 编程语言 » php文件名正则

php文件名正则

发布时间: 2023-11-28 05:09:19

php中正则问题

首先赞扬一下楼主的提问方式:
1. 对问题描述得很清晰;
2. 给出了匹配的范例文本;
3. 指定了正则式所在的语言。
这才应该是规范合理的提问。

言归正传,先根据问题,写出正则,然后落实到PHP语言。如果对分析过程不感兴趣,请直接pagedown看答案。

1. 基础
需要匹配的关键词为:test,你好,程序,分类。
正则表达式:/test|你好|程序|分类/i
(i是表示大小写不敏感模式。如果指定匹配小写的test,则可以去掉i)

2. 限制条件
a. 不在标签内部,例如<img src=asdasda.jpg alt="test" title="你好">,里面虽然有test和你好,但这不满足要求;
b. 本身无链接。例如,<a href="link1" alt="程序设计">程序设计</a>中,>程序设计<中的程序由于处于<a..>程序设计</a>之间,同样不满足要求。

根据以上限制,写出纯粹的正则式(并不能直接用在php中):
(?<!<(?:a|img)[^<>]*)(test|你好|程序|分类)(?![^<>]*</a>)
它表示,(test|你好|程序|分类)的紧临左侧不能出现<a..标签,或者<img标签;紧临右侧不能出现</a>标签。

“紧临”二字至关重要,它将无直接关系的<>都忽略掉,才确保条件的正确执行。怎样实现这一点呢?我使用的是[^<>]*。

正则式的部分这里就交待清楚了。下面将正则式应用到PHP中。

3. php正则式
php使用的正则表达式是PCRE的,它不支持在lookbehind里使用无限量词,即(?<!<(?:a|img)[^<>]*)部分不被PCRE支持。没关系,可以修改之。
(?<!(?:<a|<img))([^<>]*)(test|你好|程序|分类)(?![^<>]*(?:>|</a>))

与2中的正则式相比,前者$1即为所求,其余部分只匹配,不消耗字符;而后者$2为所求,还需要对$1进行处理。

4. php细节
我使用preg_replace_callback函数,以便自定义替换过程。代码如下,随手注释:

<?php

//此处使用heredoc语法,以便支持复杂的长文本。
$x=<<<EOT
请从以下推荐分类中选择合适的分类:<br>电脑/网络 -> <a href="link1" alt="程序设计">程序设计</a><br>
电脑/网络 -> 操作系统/系统故障<br>
<br>
如果没有合适的推荐分类,建议您更改分类,有助于获得准确解答 <br>
<img src=asdasda.jpg alt="test" title="你好"><br>
您还可以输入1381字<br>
test<br>
输入内容已经达到长度限制<br>
EOT;

//关键词数组
$a=array(
1 => "test",
2 => "你好",
3 => "程序" ,
4 => "分类"
);

//记号数组,用于记录哪些匹配是已经替换了的。因为楼主指定“每个词只匹配一次”。
$index=array();

function compute_replacement($groups) {

global $a;
global $index;

if ($index[$groups[2]])
{
//如果该关键词已经被处理过,那么直接返回整个字串($groups[0]),不作处理。
return $groups[0];
}

//查询该关键词在数组中的位置,确定序号,以便生成href="1.html"之类链接地址。
$in=array_search($groups[2],$a);

//将处理过的关键词标记为已处理,避免重复。
$index[$groups[2]]=1;

//返回处理好的文本。
return "$groups[1]<a href=\"$in.html\" title=\"$groups[2]\">$groups[2]</a>";
}

$r= preg_replace_callback('%(?<!<)([^<>]*)(test|你好|程序|分类)(?![^<>]*(?:>|</a>))%s', compute_replacement, $x);

echo $r;
?>

输出的结果为:

请从以下推荐分类中选择合适的<a href="4.html" title="分类">分类</a>:<br>电脑/网络 -> <a href="link1" alt="程序设计">程序设计</a><br>
电脑/网络 -> 操作系统/系统故障<br>
<br>
如果没有合适的推荐分类,建议您更改分类,有助于获得准确解答 <br>

<img src="asdasda.jpg" alt="test" title="你好"><br>
您还可以输入1381字<br>
<a href="1.html" title="test">test</a><br>
输入内容已经达到长度限制<br></body>

注:这里的格式不好,建议去“参考资料”所指向的地址察看更易读版本的解答。

正则表达式论坛:
正则表达式博客:

附:匹配图。高亮部分为匹配结果。

Ⅱ php 正则表达式

建议你到我的网站上下载PHP5参考手册,里边有详细的正则表达式的参考。
模式要有开始和结束的字符,一下都是合法的:
/
|
#
'
前提是模式中不能再出现这个字符了。
结尾的/后边的is是模式修政府,具体如下
i (PCRE_CASELESS)
如果设定此修正符,模式中的字符将同时匹配大小写字母。
m(PCRE_MULTILINE)
默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。

当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。

s(PCRE_DOTALL)
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。
x(PCRE_EXTENDED)
如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略。这和 Perl 的 /x 修正符是等效的,使得可以在复杂的模式中加入注释。然而注意,这仅适用于数据字符。空白字符可能永远不会出现于模式中的特殊字符序列,例如引入条件子模式的序列 (?( 中间。
e
如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。

只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。

注意: 本修正符在 PHP3 中不可用。

A(PCRE_ANCHORED)
如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。此效果也可以通过适当的模式本身来实现(在 Perl 中实现的唯一方法)。
D(PCRE_DOLLAR_ENDONLY)
如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配任何其它换行符之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。
S
当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。
U(PCRE_UNGREEDY)
本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符或者在数量符之后跟一个问号(如 .*?)来启用此选项。
X(PCRE_EXTRA)
此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,和 Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。
u(PCRE_UTF8)
此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。

Ⅲ PHP正则表达式的使用技巧

PHP正则表达式的定义

用于描述字符排列和匹配模式的一种语法规则 它主要用于字符串的模式分割 匹配 查找及替换操作

PHP中的正则函数

PHP中有两套正则函数 两者功能差不多 分别为

一套是由PCRE(Perl Compatible Regular Expression)库提供的 使用 preg_ 为前缀命名的函数

一套由POSIX(Portable Operating System Interface of Unix )扩展提供的 使用以 ereg_ 为前缀命名的函数 (POSIX的正则函数库 自PHP 以后 就不在推荐使用 从PHP 以后 就将被移除)

由于POSIX正则即将推出历史舞台 并且PCRE和perl的形式差不多 更利于我们在perl和php之间切换 所以这里重点介绍PCRE正则的使用

PCRE正则表达式

PCRE全称为Perl Compatible Regular Expression 意思是Perl兼容正则表达式

在PCRE中 通常将模式表达式(即正则表达式)包含在两个反斜线 / 之间 如 /apple/

正则中重要的几个概念有 元字符 转义 模式单元(重复) 反义 引用和断言 这些概念都可以在文章[ ]中轻松的理解和掌握

常用的元字符(Meta character)

元字符 说明

/A 匹配字符串串首的原子

/Z 匹配字符串串尾的原子

/b 匹配单词的边界 //bis/ 匹配头为is的字符串 /is/b/ 匹配尾为is的字符串 //bis/b/ 定界

/B 匹配除单词边界之外的任意字符 //Bis/启局 匹配单词 This 中的 is

/d 匹配一个数字 等价于[ ]

/D 匹配除数字以外任何一个字符 等价于[^ ]

/w 匹配一个英文字母 数字或下划线 等价于[ a zA Z_]

/W 匹配除英文字母 数字和下划线以外任何一个字符 等价于[^ a zA Z_]

/s 匹配一个空白字符 等价于[/f/t/v]

/S 匹配除空白字符以外任何一个字符 等价于[^/f/t/v]

/f 匹配一个换页符等价于 /x c 或 /cL

匹配段旁锋一个换行符 等价于 /x a 或 /cJ

匹配一个回车符等价于/x d 或 /cM

/t 匹配一个制表符 等价于 /x /或/cl

/v 匹配一个垂直制表符 等价于/x b或/ck

/oNN 匹配一个八进制数字

/xNN 匹配一个十六进制数字

/cC 匹配一个控制字符

模式修正符(Pattern Modifiers)

模式修正符在忽略大小写 匹配多行中使用特别多 掌握了这一个修正符 往往能解决我们遇到的很多问题

i -可同时匹配大小写字母

M -将字符串视为多行

S -将字符串视为单行 换行符做普通字符看待 使 匹配任何字符

X -模式中的空白忽略不计

U -匹配到最近的字符串

e -将替换的字符串作为表达使用

格式 /apple/i匹配 apple 或 Apple 等 忽略大小写 /i

PCRE的模式单元

// 提取第一位的属性

/^/d{ } ([/W])/d{ }// /d{ }$匹配 / / 等字符串 但上述正则表达式不匹配 / 的格式 这是因为模式 [/W] 的结果 / 已经被存储 下个位置 / 引用时 其匹配模式也是字符 /

当不需要存储匹配结果时使用非存储模式单元 (? )

例如/(?:a|b|c)(D|E|F)// g/ 将匹配 aEEg 在一些正则表达式中 使握晌用非存储模式单元是必要的 否则 需要改变其后引用的顺序 上例还可以写成/(a|b|c)(C|E|F)/ g/

PCRE正则表达式函数

以下为引用的内容

preg_match()和preg_match_all() preg_quote() preg_split() preg_grep() preg_replace()

函数的具体使用 我们可以通过PHP手册来找到 下面分享一些平时积累的正则表达式

匹配action属性

以下为引用的内容

$str = ; $match = ; preg_match_all( //s+action=/ (?!)( *?)/ /s/ $str $match); print_r($match);

在正则中使用回调函数

以下为引用的内容

/** * replace some string by callback function * */ function callback_replace() { $url = ; $str = ; $str = preg_replace ( /(?<=/saction=/ )(?!)( *?)(?=/ /s)/e search(/$url // ) $str ); echo $str; } function search($url $match){ return $url / $match; }

带断言的正则匹配

以下为引用的内容

$match = ; $str = xxxxxx cn bold font paragraph text

; preg_match_all ( /(?<=<(/w{ })>) *(?=</// >)/ $str $match ); echo 匹配没有属性的HTML标签中的内容 ; print_r ( $match );

替换HTML源码中的地址

以下为引用的内容

$form_ = preg_replace ( /(?<=/saction=/ |/ssrc=/ |/s)(?!|javascript)( *?)(?=/ /s)/e add_url(/$url / // / ) $form_ );

lishixin/Article/program/PHP/201311/21027

Ⅳ PHP-php中如何使用正则表达式匹配URL中的域名

<?php
//从URL中取得主机名
preg_match("/^(http://)?([^/]+)/i","IP/index.html",$matches);
$host=$matches[2];
//从主机名中取得后面两段
preg_match("/[^./]+.[^./]+$/",$host,$matches);
echo"domainnameis:{$matches[0]} ";
?>

Ⅳ PHP 正则表达式

代码如下:

<?php
$str=file_get_contents('http://abc.com/aaa.php');
if (preg_match('|<input name="a" type="hidden" value="([^"]*)"/>|', $str, $reg)) $out=$reg[1];
else $out='';
echo "$out<br>\n";
?>

热点内容
eval与php 发布:2025-01-25 07:24:28 浏览:36
服务器电脑初次上网 发布:2025-01-25 07:21:42 浏览:669
升级android6 发布:2025-01-25 07:17:59 浏览:779
多人直播源码 发布:2025-01-25 07:16:38 浏览:466
机房服务器如何安装系统 发布:2025-01-25 07:03:02 浏览:937
linux命令for循环 发布:2025-01-25 06:58:07 浏览:268
c语言链表的排序 发布:2025-01-25 06:48:17 浏览:887
查看存储空间的命令 发布:2025-01-25 06:40:06 浏览:610
安卓系统如何保活 发布:2025-01-25 06:36:27 浏览:779
缓存不退出 发布:2025-01-25 06:35:02 浏览:265