Products
GG网络技术分享 2025-03-18 16:14 4
问:应该怎么用正则过滤掉第一对p标签以及里面的内容
<div class="content"><p class="sherry_labels" style="margin:0 ;">
<a href="http://zj.admin5.com/" target="_blank">中介交易</a> <a href="http://seo.admin5.com/seozhenduan/" target="_blank">SEO诊断</a><a href="http://www.admin5.net/forum-494-1.html" title="淘宝客" target="_blank">淘宝客</a> <a href="http://www.etuan.com/" target="_blank">站长团购</a> <a href="http://yun.admin5.com/" title="云主机" target="_blank">云主机</a> <a href="http://v.admin5.com/" title="A5外包" target="_blank">A5外包</a>
</p>
<p>222</p><p>333</p><p>444</p>
</div>
$s =<<< TXT<div class="content">
<p class="sherry_labels" style="margin:0 ;">
<a href="http://zj.admin5.com/" target="_blank">中介交易</a> <a href="http://seo.admin5.com/seozhenduan/" target="_blank">SEO诊断</a><a href="http://www.admin5.net/forum-494-1.html" title="淘宝客" target="_blank">淘宝客</a> <a href="http://www.etuan.com/" target="_blank">站长团购</a> <a href="http://yun.admin5.com/" title="云主机" target="_blank">云主机</a> <a href="http://v.admin5.com/" title="A5外包" target="_blank">A5外包</a>
</p>
<p>222</p><p>333</p><p>444</p>
</div>
TXT;
echo preg_replace('#<pb.+/p>#isU', '', $s, 1);
<div class="content">
<p>222</p><p>333</p><p>444</p>
</div>
百分号通配符:在搜索串中,%表示任意字符出现的任何次数。
1:找出所有以jet开头的产品
SELECT prod_name,prod_price from products WHERE prod_name like'jet%'。
2:匹配任何位置包含文本anvil的值
SELECT prod_name,prod_price from products WHERE prod_name like'%anvil%'
注意:%可以匹配0个字符,但不能匹配null值.
下划线通配符:下划线只匹配单个字符而不是多个字符。
1:SELECT prod_name,prod_price from products WHERE prod_name like'_ ton anvil%'
通配符使用技巧:1、不要过度使用通配符,如果使用其他操作符能达到相同的目的,应该使用其他操作符;
2、在确实使用通配符时,最好不要把它们置于搜索模式的开始处.那样是最慢的.
正则表达式:1:检索列prod_name中包含文本1000的所有行
SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '1000'ORDER BY prod_name;
2:检索列prod_name中包含文本000的所有行
prod_name,prod_price from products WHERE prod_nameREGEXP '.000'ORDER BY prod_name;
上面正则表达式中的“.”表示匹配任意一个字符。
3:检索列prod_name中包含文本1000或2000的所有行
SELECT prod_name,prod_price from products WHERE prod_name REGEXP '1000|2000'ORDER BY prod_name;
4:匹配几个字符之一
SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '[1-3] ton' ORDER BY prod_name;
[1-3]意思为“1|2|3” 如图
匹配特殊字符
SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '\.'ORDER BY prod_name;
上面为了匹配特殊字符,需要使用\为前导(转义) 为了匹配“”,需要使用“\”
5: 匹配字符类
SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '[:upper:]' ORDER BY prod_name;
REGEXP '[:upper:]' 表示匹配任意大写字母。还有其它字符类如下:
6:匹配多个实例
重复元字符
SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '\([0-9] sticks?\)'ORDER BY prod_name;
解释一下:第一个\转义“(” 用 [0-9]表示匹配任意数字,sticks?表示匹配stick 或者sticks ,"?"使得sticks后的s变为可选值. ?表示它前面的字符出现0次或者1次。 最后一个\转义")"
输出为:7:SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '[[:digit:]]{4}'ORDER BY prod_name;
REGEXP '[[:digit:]]{4}'匹配连在一起的任意4位数字.
8:定位符
^有两种用法,在集合中(用“[”和“]”)定义,用它来否定该集合,否则,用来指串的开始处.
SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '^[0-9\.]'ORDER BY prod_name;
找出以任意数字为串中第一个字符时的匹配;
正则表达式与like的区别:like匹配整个串,而regexp匹配子串.利用定位符,用"^"开始,"$"结尾,可以使regexp与like的作用一样.
为了得到一个标准的内容,在采集上必须下足功夫才行!编写好采集规则。
每一个段落都是<p></p>
没有多余的HTML标签和与主题无关的字符
提取数据方式
选择 正则提取,组合结果填 <p>[参数1]</p>
有些内容开始和结尾并没有p标签,换行是用br标签来完成,所以我们要创造p标签
数据处理
第一步:清除与正文无关的内容,如文中的广告,注释等
正则 <header>[sS]*?</header>|<!--.*?-->| |规则4|规则5 替换为 空
如果发布到一些免费平台,有的HTML特殊字符并不会被转化,只需在末尾加入'|&.*?;'过滤掉最后特殊HTML字符即可。
第二步:只保留图片以及常用的块级元素
正则 (?i)<(?!/?h|/?p|/?div|br|img).*?> 替换为 空
只保留标题标签 h 分段标签 p、div、br 以及图像标签 img ;前面的(?i)表示不区分大小写
第三步:去掉除了img标签外的所有标签的选择器或样式,并把标签修改为p
正则 <(?!img)(/?)w+.*?> 替换为 <$1p>
第四步:把乱七八糟的图像样式,改成标准图像代码
正则 <img.*?src="(.+?)".*?> 替换为 <img src="$1">
第五步:规范段落标签<p>开始</p>结束
正则 </?p>替换为</p><p>
慧聪网段落只有<p>开始没有</p>结束
某些站个别文章,</p>结束后没有<p>开始就直接是下个段落的内容
第六步:把<p>或</p>前后的空格替换为空
正则 s*(</?p>)s* 替换为 $1
第七步:把连续2个以上的<p>或</p>替换为1个
正则 (<p>){2,}|(</p>){2,} 替换为 $1$2
第八步:把所有的空段落替换为空
内容 <p></p> 替换为 空
第九步:由于第五步的关系,文章开头可能是</p>结尾可能是<p>需要清理他们
正则 ^</p>|<p>$ 替换为 空
过滤英文正则 [a-zA-Z]
正则过滤两位以上的数字(d{2,100})
过滤正则表达式,只保留中文、英文、数字及一些标点符号.
str = "123,456" # 要过滤的字符串re_exp = u"([^u4e00-u9fa5u0030-u0039u0041-u005au0061-u007a’!"#$%&'()*+,-./:;<=>?@,。?、…【】《》?“”‘’!["u"\]^_`{|}~s])" # 过滤正则表达式,只保留中文、英文、数字及一些标点符号
re_exp_2 = u"([.*[d+].*])" # 过滤形如[1]等的引用
result_str = re.sub(re_exp, "", str)
print(result_str)
(((http|ftp|https)://)?)([a-zA-Z0-9.-])(:[0-9]{1,4})/[a-zA-Z0-9&%./-~-]*
# 正则表达式<img[sS]+?src=['"](.+?)['"][sS>]?>
w 匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下
或许你也需要匹配双字节字符,中文也是双字节的字符
Demand feedback