Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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
解析mailTo的php正则表达式_Php_Regex - Fatal编程技术网

解析mailTo的php正则表达式

解析mailTo的php正则表达式,php,regex,Php,Regex,我有以下html源字符串: <a href="mailto:abcd@test.com?body=This%20is%20the%20body%20-123-&subject=Subject%20Text&Content-Type=text/plain">Reply To Post</a> 我想从上面的字符串中提取: 在mailto:之后和之前的电子邮件地址 身体 主题 任何关于正则表达式的帮助都将不胜感激。提前谢谢。试试这个 $m = preg_m

我有以下html源字符串:

<a href="mailto:abcd@test.com?body=This%20is%20the%20body%20-123-&subject=Subject%20Text&Content-Type=text/plain">Reply To Post</a>

我想从上面的字符串中提取:

  • 在mailto:之后和之前的电子邮件地址
  • 身体
  • 主题
  • 任何关于正则表达式的帮助都将不胜感激。提前谢谢。

    试试这个

    $m = preg_match("/mailto:(.+?)\?/");
    
    它匹配单词
    mailto
    ,后跟一个冒号,后跟一个包含任何字符
    的捕获组(括号),一次或多次
    +
    不贪婪(?-它将使捕获尽可能短),后跟一个(转义的)问号(
    \?

    试试这个

    $m = preg_match("/mailto:(.+?)\?/");
    

    它匹配单词
    mailto
    ,后跟一个冒号,后跟一个包含任何字符
    的捕获组(括号),
    +
    一次或多次不贪婪地匹配(-它将使捕获尽可能短),后跟一个(转义的)问号(
    \?
    )第二部分不需要正则表达式,国际海事组织

    类似于:(
    $s
    是以下代码中
    href
    的值)


    实际上,如果您确定字符串以完全相同的方式显示,您也可以从索引的偏移量“:“直到索引的”?”获取子字符串。

    第二部分不需要正则表达式,国际海事组织

    类似于:(
    $s
    是以下代码中
    href
    的值)


    实际上,如果您确定字符串以完全相同的方式显示,您也可以从索引的偏移量“:“直到索引的”?”中获取子字符串。

    没有在PHP中尝试过它,但它在以下情况下运行良好:

    “mailto:([\w%.+-]+?@[\w.-]+?)(?:[?&](?:body=(.*?)| subject=(.*?)[\w-]+=*?)+?”

    这将导致以下捕获组:

    • 1:电子邮件地址
    • 2:主体
    • 3:主题

    不过,您可能需要做一些更密集的测试,因为我不确定是否已获得所有有效的邮件地址。

    没有在PHP中尝试过,但在以下情况下效果良好:

    “mailto:([\w%.+-]+?@[\w.-]+?)(?:[?&](?:body=(.*?)| subject=(.*?)[\w-]+=*?)+?”

    这将导致以下捕获组:

    • 1:电子邮件地址
    • 2:主体
    • 3:主题

    不过,您可能需要做一些更深入的测试,因为我不确定是否拥有所有有效的邮件地址。

    这将假定您只有一个mailto链接:

    // $str will be your string content from the question
    if (preg_match('/"mailto:([^"]+?)/', $str, $matches) && false !== ($info = parse_url($matches[1]))) {
            $emailAddress = $info['path'];
            $emailParameters = array();
            if (isset($info['query'])) {
                    parse_str($info['query'], $emailParameters);
            }
            var_dump($emailAddress, $emailParameters);
    }
    

    它从
    “mailto:
    匹配到第一个结束引号,并使用
    解析url
    完成其余操作。

    这将假定您只有一个mailto链接:

    // $str will be your string content from the question
    if (preg_match('/"mailto:([^"]+?)/', $str, $matches) && false !== ($info = parse_url($matches[1]))) {
            $emailAddress = $info['path'];
            $emailParameters = array();
            if (isset($info['query'])) {
                    parse_str($info['query'], $emailParameters);
            }
            var_dump($emailAddress, $emailParameters);
    }
    

    它从
    “mailto:
    匹配到第一个结束引号,并使用
    parse_url
    完成其余部分。

    我认为Regex是一个过量的变量。问题中的字符串看起来像是可以解析为查询字符串。检查我的答案..我认为正则表达式有点过头了。问题中的字符串看起来可以解析为查询字符串。检查我的答案。
    >
    不是真实字符串的一部分(我在编辑之前得到了字符串)。这些都是由于堆栈溢出的报价标记出错造成的。试图解决这个问题。是的,很好。虽然我不会在这里使用索引。还有一件事需要解决:您忘记了根本没有参数的情况(以防可能发生)。
    >
    不是真正字符串的一部分(我在编辑之前得到了字符串)。这些都是由于堆栈溢出的报价标记出错造成的。试图解决这个问题。是的,很好。虽然我不会在这里使用索引。还有一件事需要解决:你忘记了根本没有参数的情况(以防发生)。啊,好主意。使用
    parse\u url()
    比在这里重新发明轮子要容易得多,尽管
    parse\u str()
    应该足够了。啊,好主意。使用
    parse_url()
    比在这里重新发明轮子容易得多,尽管
    parse_str()
    应该足够了。模式只捕获电子邮件,而不是OP要求的测试。模式只捕获电子邮件,而不是OP要求的测试。