Regex single-line multiple match(正则表达式单行多匹配)
本文介绍了正则表达式单行多匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在PHP中使用preg_replace时,我尝试在一个字符串中多次匹配一个正则表达式模式,有时1行有2个匹配,有时不匹配。
我有以下字符串:
$text = 'Check <a href="link1">text1</a> or <a href="link2">text2</a>
oh
well <a href="link3">text3</a>';
我希望将其转换为:
Check
text1
link1
or
text2
link2
oh
well
text3
link3
我有这个:
$text = preg_replace('/(<a href=")(.+)(">)(.*)(</a>)/', "
$4
$2
", $text);
但它不起作用,只有在一行有1个匹配的情况下。点赞:
$text = 'Check <a href="link1">text1</a>
or <a href="link2">text2</a>
oh
well <a href="link3">text3</a>';
感谢任何帮助。
使用a和b的示例 http://www.phpliveregex.com/p/4fUHTML
迭代在给定推荐答案中可以找到的所有文本节点,并为父锚点创建特殊情况:
$text = 'Check <a href="link1">text1</a> or <a href="link2">text2</a>
oh
well <a href="link3">text3</a>';
$dom = new DOMDocument;
$dom->loadHTML($text);
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//text()') as $node) {
if ($node->nodeType == XML_TEXT_NODE) {
echo $node->textContent, "
";
if ($node->parentNode->nodeType == XML_ELEMENT_NODE && $node->parentNode->nodeName == 'a') {
echo $node->parentNode->getAttribute('href'), "
";
}
}
}
在文本域中,您可以这样做:
echo preg_replace('~<a href="([^"]+)">([^<]+)</a>~i', "
$2
$1", $text);
基本上,href和tag内容封装使用的是负字符集,而不是简单的.+和.*,因为它们在默认情况下是贪婪的;可以分别使用.+?和.*?来更改这一点,但是负字符集会减少回溯。
另外,您只需要对锚点的两个部分执行内存捕获,而不是对全部五个部分执行内存捕获。
这篇关于正则表达式单行多匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
织梦狗教程
本文标题为:正则表达式单行多匹配
基础教程推荐
猜你喜欢
- 在PHP中根据W3C规范Unicode 2022-01-01
- 有什么方法可以用编码 UTF-8 而不是 Unicode 返回 PHP`json_encode`? 2021-01-01
- 如何替换eregi() 2022-01-01
- PHP 类:全局变量作为类中的属性 2021-01-01
- 如何在 Laravel 中使用 React Router? 2022-01-01
- Cron Jobs 调用带有变量的 PHP 脚本 2022-01-01
- 学说 dbal querybuilder 作为准备好的语句 2022-01-01
- PHP PDO MySQL 查询 LIKE ->多个关键词 2021-01-01
- YouTube API v3 点赞视频,但计数器不增加 2022-01-01
- 如何在 Laravel 5.3 注册中添加动态下拉列表列? 2021-01-01
