phpa正则
Ⅰ 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的正则,怎么匹配a标签
preg_match_all ('/<a href="(.*?)".*?>(.*?)</a>/i',$yuanstr,$matches);
$1是链接 $2是链接文字
Ⅲ 怎么用php正则获得a标签内的文字啊
php中正则匹配只要使用这两个函数:
preg_match_all
preg_match
这里使用preg_match_all,代码如下:
$subject='<ahref="xxx.php">abc测试</a>';//假设这是需要匹配的字符串
$pattern='/<ahref="[^"]*"[^>]*>(.*)</a>/';//这是匹配的正则表达式
preg_match_all($pattern,$subject,$matches);//开始匹配,该函数会把匹配结果放入$matches数组中
echo"<pre>";
print_r($matches);
/**
结果是:
Array
(
[0]=>Array
(
[0]=>abc测试
)
[1]=>Array
(
[0]=>abc测试
)
)
*/
Ⅳ php正则表达式匹配a标签
我的理解是匹配<a 字符串>,字符串中不能有"
Ⅳ php 正则表达是匹配a标签
可以,但是要用非贪婪模式:
'/<a.+?</a>/is';
'/<a[sS]+?</a>/i';
[sS] 表示任意字符(. 是除换行以外的任意字符)
+? 或 *? 是非贪婪模式的意思
两个正则是等效的
Ⅵ PHP 正则匹配A标签获得连接和文字
<a\b[^>]*\bhref=([^\s>]+)[^>]*>[\s\S]*?([^<>]*)</a>
解释:
<a\b #匹配a标签的开始
[^>]* #匹配a标签href属性前的其他属性
\bhref=([^\s>]+) #匹配href属性,并将匹配到的内容捕获到分组1当中
[^>]*> #匹配a标签的结束
[\s\S]*? #匹配a标签文本前的img标签
([^<>]*) #匹配a标签文本并捕获到分组2当中
</a> #匹配a标签的关闭
分组1和分组2即为所需内容
简化版:
<a\s*href=([^>]+)><img[^>]+>([^>]+)</a>
实际上简化版可能效率更高……因为严格按照原文本格式来匹配。
不过如果标签形式有一点变化就可能导致匹配失败,所以这里写了两个版本。。
Ⅶ php正则表达式
这里涉及到正则表达式中得子串捕获的概念。php中的正则表达式使用的是pcre正则库,因此使用方式上和pcre是相同的,只不过是为了使用方便封装了一起便捷的操作而已。preg_match函数和preg_match_all函数用于在php中进行正则表达式的相关处理。下面看下preg_match函数的定义:intpreg_match(string$pattern,string$subject[,array&$matches])在$subject中查询$pattern,如果找到则把匹配的字符串存储在$matches中。$matches[0]中存放整个匹配的字符串,$matches[i]中存放匹配到的第i个捕获子串。题目的解决方法:$pattern="/^NAME(.*){$/";preg_match($pattern,$string,$match);echo$match[1];//$match[1]为提取的NAME和{之间的内容。关于捕获组信息($match的信息)详情,可以参考文档:http://wang
Ⅷ php 正则 <a ></a> 中的 href 和img 地址
针对给定的标本数据,编写如下正则供参考:
1、提取 jpg 地址链接
"(http://.*?.jpg)"
2、提取 a href 或是 img src 标签中的 jpg 地址链接
[href|src]="(http://.*?.jpg)"
3、提取<a></a>标签中的 jpg 地址链接
(<a.*)(http://.*.jpg)(".*")(http:/.*.jpg)(".*)</a>
Ⅸ php正则匹配所有a标签,并删除
1,过滤所有html标签的正则表达式:</?[^>]+>
2,过滤所有html标签的属性的正则表达式:$html = preg_replace("/<([a-zA-Z]+)[^>]*>/","<\\1>",$html);
3,过滤部分html标签的正则表达式的排除式(比如排除<p>,即不过滤<p>):</?[^pP/>]+>
4,过滤部分html标签的正则表达式的枚举式(比如需要过滤<a><p><b>等):</?[aApPbB][^>]*>
5,过滤部分html标签的属性的正则表达式的排除式(比如排除alt属性,即不过滤alt属性):\s(?!alt)[a-zA-Z]+=[^\s]*