Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式单行多重匹配_Php_Regex_Preg Replace - Fatal编程技术网

Php 正则表达式单行多重匹配

Php 正则表达式单行多重匹配,php,regex,preg-replace,Php,Regex,Preg Replace,使用PHP中的preg_replace,我试图在一个字符串中多次匹配一个正则表达式模式,有时在一行上会有两个匹配,有时不会 我有以下字符串: $text = 'Check <a href="link1">text1</a> or <a href="link2">text2</a> oh well <a href="link3">text3</a>'; 我有这个: $text = preg_replace('/(&l

使用PHP中的
preg_replace
,我试图在一个字符串中多次匹配一个正则表达式模式,有时在一行上会有两个匹配,有时不会

我有以下字符串:

 $text = 'Check <a href="link1">text1</a> or <a href="link2">text2</a>
 oh
 well <a href="link3">text3</a>';
我有这个:

 $text = preg_replace('/(<a href=")(.+)(">)(.*)(<\/a>)/', "\n$4\n$2\n", $text);
$text=preg_replace('/)
或
哦
嗯",;
谢谢你的帮助

以a和b为例

这不是为了解决您的问题,但您可以在最后一个斜杠后向正则表达式模式添加修饰符:

preg_replace('/which_my_pattern_do/MODIFIERS',“here I replace”,$text)


您应该全部检查它们

在给定HTML中可以找到的所有文本节点上迭代,并为父锚点创建一个特例:

$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, "\n";
        if ($node->parentNode->nodeType == XML_ELEMENT_NODE && $node->parentNode->nodeName == 'a') {
                echo $node->parentNode->getAttribute('href'), "\n";
        }
  }
}
$text='检查或
哦
嗯",;
$dom=新的DOMDocument;
$dom->loadHTML($text);
$xpath=newdomxpath($dom);
foreach($xpath->query('//text()')作为$node){
如果($node->nodeType==XML\u TEXT\u node){
echo$node->textContent,“\n”;
如果($node->parentNode->nodeType==XML\u ELEMENT\u node&&$node->parentNode->nodeName==a'){
echo$node->parentNode->getAttribute('href'),“\n”;
}
}
}
在文本域中,您可以这样做:

echo preg_replace('~<a href="([^"]+)">([^<]+)</a>~i', "\n\$2\n\$1", $text);

echo preg_replace(“~在结果字符串中,
link1
text1
是否真的需要按相反的顺序排列?好吧,最好是这样,但不是100%必要。这对用户来说更清楚。我正在尝试创建一个纯文本邮件,它将被解析为HTML邮件。PCRE中没有
g
标志。
preg_replace()
默认情况下会替换所有出现的内容。Wop,你说得对,我会编辑评论,谢谢!谢谢,但我想了解如何使用preg_replace解决这个问题,因为如果我理解的话,我可以在非HTML情况下重复使用此模式。谢谢,但现在我看到一个问题,即随附的text1、text2、text3也有HTML标记
@Sanne这就是我要告诉你的,这不是一个文本问题。HTML中的问题用另一种方式解决。你的其他代码也有封闭标记的问题。链接被删除。
$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, "\n";
        if ($node->parentNode->nodeType == XML_ELEMENT_NODE && $node->parentNode->nodeName == 'a') {
                echo $node->parentNode->getAttribute('href'), "\n";
        }
  }
}
echo preg_replace('~<a href="([^"]+)">([^<]+)</a>~i', "\n\$2\n\$1", $text);