草庐IT

来自 Array with Multine 的 PHP 正则表达式 preg_match 不匹配所有 block

coder 2024-04-18 原文

想知道是否有人可以帮助我使用以下正则表达式,我无法匹配 block multine CF.{Coordonnees Abonne}: 在 PHP 的 preg_match 函数中使用时。

奇怪的是,当我在线执行正则表达式时,尽管该 block 在另一个组中,它似乎仍然有效 regex101 example

这是代码: source code

<?php
$response = array(
      1  => 'CF.{Temps}: 1',
      2  => 'CF.{Etat}: return',
      3  => 'CF.{Code}: 2',
      4  => 'CF.{Values}: plaque',
      5  => '',
      6  => 'CF.{Coordonnees}: LA PERSONNE',
      7  => '    ',
      8  => '    10000  LA VILLE',
      9  => '    ',
      10 => '    0500235689',
      11 => '    0645788923',
      12 => '    Login : test@mail.com',
      13 => '    Password : PassWord!',
      14 => '',
      15 => 'CF.{Groupe}: 3',
      16 => 'CF.{Date}: 4',
);

print_r(parseResponseBody($response));

function parseResponseBody(array $response, $delimiter = ':')
{
    $responseArray = array();
    $lastkey = null;

    foreach ($response as $line) {
        if(preg_match('/^([a-zA-Z0-9]+|CF\.{[^}]+})' . $delimiter . '\s(.*)|([a-zA-Z0-9].*)$/', $line, $matches)) {
                $lastkey = $matches[1];
                $responseArray[$lastkey] = $matches[2];
        }
    }

    return $responseArray;
}
?>

输出:

Array
(
    [CF.{Temps}] => 1
    [CF.{Etat}] => return
    [CF.{Code}] => 2
    [CF.{Values}] => plaque
    [CF.{Coordonnees}] => LA PERSONNE
    [] => 
    [CF.{Groupe}] => 3
    [CF.{Date}] => 4
)

还有我需要提取的最终结果:

Array
(
    [CF.{Temps}] => 1
    [CF.{Etat}] => return
    [CF.{Code}] => 2
    [CF.{Values}] => plaque
    [CF.{Coordonnees}] => LA PERSONNE

        10000  LA VILLE

        0500235689
        0645788923
        Login : test@mail.com
        Password : PassWord!
    [CF.{Groupe}] => 3
    [CF.{Date}] => 4
)

最佳答案

您必须检查迭代时的当前值是否以 block 开头。虽然不是同时:

function parseResponseBody(array $response, $delimiter = ':') {
    $array = [];
    $lastIndex = null;
    foreach ($response as $line) {
        if (preg_match('~^\s*(CF\.{[^}]*})' . $delimiter . '\s+(.*)~', $line, $matches))
            $array[$lastIndex = $matches[1]] = $matches[2];
        elseif ((bool) $line)
            $array[$lastIndex] .= PHP_EOL . $line;
    }
    return $array;
}

Live demo

关于来自 Array with Multine 的 PHP 正则表达式 preg_match 不匹配所有 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48931533/

有关来自 Array with Multine 的 PHP 正则表达式 preg_match 不匹配所有 block的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  3. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  4. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  5. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

    我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

  6. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  7. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  8. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  9. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  10. ruby - 在匿名 block 中产生 - 2

    我没有理解以下行为(另请参阅inthisSOthread):defdef_testputs'def_test.in'yieldifblock_given?puts'def_test.out'enddef_testdoputs'def_testok'endblock_test=procdo|&block|puts'block_test.in'block.callifblockputs'block_test.out'endblock_test.calldoputs'block_test'endproc_test=procdoputs'proc_test.in'yieldifblock_gi

随机推荐