【问题标题】:preg_match will not ignore new line breakspreg_match 不会忽略换行符
【发布时间】:2023-04-09 03:43:01
【问题描述】:

任务:找到 10 个单词并忽略换行符。

我为multi-line 添加了m 标志,但没有任何效果。

<?php

$string = "this is line one\n this is line two\n this is line three\n";
$pattern = '/([A-Za-z0-9\.]+ ){1,10}([A-Za-z0-9\.]+)/m';
preg_match($pattern, $string, $matches);
echo $matches[0];
echo "\n";

?>

结果:

this is line one

想要的结果:

this is line one this is line two this is line

为了这个理想的结果,我只是手动删除了新的换行符。

虽然这个期望的结果也不是完美的..因为它总共是 11 个单词而不是 10.. 如果我能做到这一点,我仍然会离我的使命越来越近。

【问题讨论】:

  • 将空格替换为\s+。而且您仍然需要从结果中删除换行符。你不能匹配一个文本字符串,同时在这个匹配中删除一些重复的模式,你将不得不使用 2 个操作。
  • 而如果你最多需要10个单词,你只需要调整量词'/[A-Za-z0-9.]+(?:\s+[A-Za-z0-9.]+){0,9}/'
  • m 是修改^$ 的行为,而不是做一个正则表达式多行。
  • 您可能还想将\b 视为单词边界。

标签: php regex preg-match


【解决方案1】:

我的猜测是,也许您正在尝试使用双界量词编写一些表达式,例如:

(?i)^(\s*[a-z0-9. ]{1,10}(?=\s|$)){0,4}$

Demo 1

(?i)^(\s*[a-z0-9. ]{1,10}(?=\s|$)){0,5}

Demo 2

(?i)(\s*[a-z0-9. ]{1,10}(?=\s|$)){0,5}

Demo 3

 (?:\S+(?=\s|$)\s*){6}

Demo 4

(?:\S+\s*){6}

Demo 5

或用于捕捉前六个单词,例如,

^(?:(\S+)\s*)(?:(\S+)\s*)(?:(\S+)\s*)(?:(\S+)\s*)(?:(\S+)\s*)(?:(\S+)\s*)

Demo 6

【讨论】:

    【解决方案2】:

    这是查找 10 个单词的正则表达式。
    获得一个匹配,然后使用空格加入第 1-10 组。

    (?s)(?&lt;!\S)([A-Za-z0-9\.]+)(?!\S).*?(?&lt;!\S)([A-Za-z0-9\.]+)(?!\S).*?(?&lt;!\S)([A-Za-z0-9\.]+)(?!\S).*?(?&lt;!\S)([A-Za-z0-9\.]+)(?!\S).*?(?&lt;!\S)([A-Za-z0-9\.]+)(?!\S).*?(?&lt;!\S)([A-Za-z0-9\.]+)(?!\S).*?(?&lt;!\S)([A-Za-z0-9\.]+)(?!\S).*?(?&lt;!\S)([A-Za-z0-9\.]+)(?!\S).*?(?&lt;!\S)([A-Za-z0-9\.]+)(?!\S).*?(?&lt;!\S)([A-Za-z0-9\.]+)(?!\S)

    https://regex101.com/r/g0Luco/1

    【讨论】:

      猜你喜欢
      • 2010-11-17
      • 2017-07-05
      • 2021-06-17
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 2020-08-08
      相关资源
      最近更新 更多