如何写这样一个过滤字符串的正则?

郑小静 发布于 2015/12/21 09:39
阅读 536
收藏 1

57< img src="/dev-build/5c1800f8cea587969777d0e2a11ec895.png" class="face-pic" data-labface="4">fd< img src="/dev-build/1157a424588a6732a95ac1d622e129d0.png" class="face-pic" data-labface="17">12< img src="/dev-build/bc2e80fa39a2f7d95737fdbec02c0b27.png" class="face-pic" data-labface="21">比比

这里有这样一个字符串,我想取出文字内容和图片上面的data-labface的属性,按照顺序组成一个数组,

这是一段,用户自行输入的文本内容。

加载中
0
wuyiw
wuyiw

问一下:

这个确实是用户输入的字符串吗? 还是用户输入内容的html源码?

个人觉得既然是js里面做, 可以考虑下面方式:

var srcStr = '57< img src="/dev-build/5c1800f8cea587969777d0e2a11ec895.png" class="face-pic" data-labface="4">fd< img src="/dev-build/1157a424588a6732a95ac1d622e129d0.png" class="face-pic" data-labface="17">12< img src="/dev-build/bc2e80fa39a2f7d95737fdbec02c0b27.png" class="face-pic" data-labface="21">比比'
	// "<"和"img"之间有个空格, 这不是合法的html.
	.replace(/< img/g, '<img')
// 解析为dom
,domParser = new DOMParser()
,doc = domParser.parseFromString(srcStr, 'text/html')
,nodes = Array.prototype.slice.call(doc.body.childNodes)
// 过滤只取文本和img节点, 然后取出文本内容和img的data-labface属性
,resArr = nodes.filter(function(node) {
	return node.nodeType==3 || node.tagName=='IMG'
}).map(function(node) {
	return node.nodeType==3 ? node.nodeValue : node.getAttribute('data-labface')
})
console.log(resArr)



郑小静
郑小静
哇瑟,我测试了下是我要的结果呢,谢谢这位大神。。。。
郑小静
郑小静
空格是我黏贴进去的时候产生的,可以忽略。。。
郑小静
郑小静
这个是用户输入的一段文本,里面包括文字内容和表情,图片就是表情,我想取出的是 文本内容 和 表情符号中的data-labface属性的值, 例如 ['57', '4', 'fd', '17', '12', '21', '比比']
1
jamesyx
jamesyx

今儿个心情好,做一下活雷锋
JavaScript:
====================
var myregexp = /src="([^"]+)" class="face-pic" data-labface="(\d+)"/img;
var match = myregexp.exec(subject);
while (match != null) {
 for (var i = 0; i < match.length; i++) {
  // matched text: match[i]
 }
 match = myregexp.exec(subject);
}

Java:
====================

try {
 Pattern regex = Pattern.compile("src=\"([^\"]+)\" class=\"face-pic\" data-labface=\"(\\d+)\"", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE | Pattern.MULTILINE);
 Matcher regexMatcher = regex.matcher(subjectString);
 while (regexMatcher.find()) {
  for (int i = 1; i <= regexMatcher.groupCount(); i++) {
   // matched text: regexMatcher.group(i)
   // match start: regexMatcher.start(i)
   // match end: regexMatcher.end(i)
  }
 }
} catch (PatternSyntaxException ex) {
 // Syntax error in the regular expression
}

php

=================

preg_match_all('/src="([^"]+)" class="face-pic" data-labface="(\d+)"/im', $subject, $result, PREG_SET_ORDER);
for ($matchi = 0; $matchi < count($result); $matchi++) {
 for ($backrefi = 0; $backrefi < count($result[$matchi]); $backrefi++) {
  # Matched text = $result[$matchi][$backrefi];
 }
}

0
x
xice

js代码:

console.log('57< img src="/dev-build/5c1800f8cea587969777d0e2a11ec895.png" class="face-pic" data-labface="4">fd< img src="/dev-build/1157a424588a6732a95ac1d622e129d0.png" class="face-pic" data-labface="17">12< img src="/dev-build/bc2e80fa39a2f7d95737fdbec02c0b27.png" class="face-pic" data-labface="21">比比'.match(/data-labface="[0-9]+"/gi));



自己根据情况改正则,这里只匹配了数字,大小写不敏感
/data-labface="[0-9]+"/gi

返回顶部
顶部