用php获得和之间的所有内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用php获得和之间的所有内容相关的知识,希望对你有一定的参考价值。

我正在尝试使用正则表达式在字符串中捕获字符串。

我看了看,但是我似乎看不到我必须工作的任何示例。

我需要获取html标签和 code>以及它们之间的所有内容。

然后,我需要从父字符串中提取匹配的字符串,对二者进行操作,

然后将匹配的字符串放回父字符串中。

这是我的代码:

$content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. <code>Donec sed erat vel diam ultricies commodo. Nunc venenatis tellus eu quam suscipit quis fermentum dolor vehicula.</code>"
$regex='';
$code = preg_match($regex, $text, $matches);

我已经尝试过这些但没有成功:

$regex = "/<codes*(.*)>(.*)</code>/";
$regex = "/<code>(.*)</code>/";
答案

您可以使用以下内容:

$regex = '#<s*?code[^>]*>(.*?)</code[^>]*>#s';
  • [确保不会捕获错字(如<codeS>)。
  • 第一个模式[^>]*捕获具有属性(例如,类)的标签的内容。
  • 最后,标志s用换行符捕获内容。

在此处查看结果:http://lumadis.be/regex/test_regex.php?id=1081

另一答案
$regex = '#<code>(.*?)</code>#';

使用#作为定界符而不是/,因为这样我们就不必转义/中的</code>

如下面的Phoenix所述,.*?用于使.*(“任何内容”)在遇到</code>(称为“非贪婪量词”)之前尽可能少地匹配字符。这样,如果您的字符串是

<code>hello</code> something <code>again</code>

您将匹配helloagain,而不仅仅是匹配hello</code> something <code>again

另一答案

此功能对我有用

<?php

function everything_in_tags($string, $tagname)
{
    $pattern = "#<s*?$tagname[^>]*>(.*?)</$tagname[^>]*>#s";
    preg_match($pattern, $string, $matches);
    return $matches[1];
}

?>
另一答案

您可以使用/<code>([sS]*)</code>/msU这也吸引了NEWLINES!

另一答案
function contentDisplay($text)
{
    //replace UTF-8
    $convertUT8 = array("xe2x80x98", "xe2x80x99", "xe2x80x9c", "xe2x80x9d", "xe2x80x93", "xe2x80x94", "xe2x80xa6");
    $to = array("'", "'", '"', '"', '-', '--', '...');
    $text = str_replace($convertUT8,$to,$text);

    //replace Windows-1252
    $convertWin1252 = array(chr(145), chr(146), chr(147), chr(148), chr(150), chr(151), chr(133));
    $to = array("'", "'", '"', '"', '-', '--', '...');
    $text = str_replace($convertWin1252,$to,$text);

    //replace accents
    $convertAccents = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'Ð', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', '?', '?', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', '?', '?', 'L', 'l', 'N', 'n', 'N', 'n', 'N', 'n', '?', 'O', 'o', 'O', 'o', 'O', 'o', 'Œ', 'œ', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'Š', 'š', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Ÿ', 'Z', 'z', 'Z', 'z', 'Ž', 'ž', '?', 'ƒ', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', '?', '?', '?', '?', '?', '?');
    $to = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
    $text = str_replace($convertAccents,$to,$text);

    //Encode the characters
    $text = htmlentities($text);

    //normalize the line breaks (here because it applies to all text)
    $text = str_replace("
", "
", $text);
    $text = str_replace("
", "
", $text);

    //decode the <code> tags
    $codeOpen = htmlentities('<').'code'.htmlentities('>');
    if (strpos($text, $codeOpen))
    {
        $text = str_replace($codeOpen, html_entity_decode(htmlentities('<')) . "code" . html_entity_decode(htmlentities('>')), $text);
    }
    $codeOpen = htmlentities('<').'/code'.htmlentities('>');
    if (strpos($text, $codeOpen))
    {
        $text = str_replace($codeOpen, html_entity_decode(htmlentities('<')) . "/code" . html_entity_decode(htmlentities('>')), $text);
    }

    //match everything between <code> and </code>, the msU is what makes this work here, ADD this to REGEX archive
    $regex = '/<code>(.*)</code>/msU';
    $code = preg_match($regex, $text, $matches);
    if ($code == 1)
    {
        if (is_array($matches) && count($matches) >= 2)
        {
            $newcode = $matches[1];

            $newcode = nl2br($newcode);
        }

    //remove <code>and this</code> from $text;
    $text = str_replace('<code>' . $matches[1] . '</code>', 'PLACEHOLDERCODE1', $text);

    //convert the line breaks to paragraphs
    $text = '<p>' . str_replace("

", '</p><p>', $text) . '</p>';
    $text = str_replace("
" , '<br />', $text);
    $text = str_replace('</p><p>', '</p>' . "

" . '<p>', $text);

    $text = str_replace('PLACEHOLDERCODE1', '<code>'.$newcode.'</code>', $text);
    }
    else
    {
        $code = false;
    }

    if ($code == false)
    {
        //convert the line breaks to paragraphs
        $text = '<p>' . str_replace("

", '</p><p>', $text) . '</p>';
        $text = str_replace("
" , '<br />', $text);
        $text = str_replace('</p><p>', '</p>' . "

" . '<p>', $text);
    }

    return $text;
}
另一答案

您也可以尝试:

function getTagValue($string, $tag)
{
    $pattern = "/<{$tag}>(.*?)</{$tag}>/s";
    preg_match($pattern, $string, $matches);
    return isset($matches[1]) ? $matches[1] : '';
}

如果不匹配,它将返回空字符串。

另一答案

即使在特殊情况下,例如<script async>,也要检索或删除脚本标签的内容。

$str = '
Some js embed
<script async>
  alert("js")
  let job, origin = new Date().getTime()
</script>
<span id="OUT"></span>
<button onclick="alert()">RESET</button>
timer experiment
';

$reg = '/<script([sS]*)</script>/';

preg_match($reg, $str, $matches);
$match = substr($matches[0], (strpos($matches[0], ">")+1));
$match = str_replace("</script>", "", $match);
echo $match;
/* OUTPUT
  alert("js")
  let job, origin = new Date().getTime()
*/
echo "
---------------------
";
echo preg_replace($reg, "DELETED", $str);
/* OUTPUT
  Some js embed
  DELETED
  <span id="OUT"></span>
  <button onclick="alert()">RESET</button>
  timer experiment
*/

以上是关于用php获得和之间的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

PHP必用代码片段

在 PHP SDK 和 Graph API Explorer 之间获得不同的结果

php 正则表达式 匹配网站内容

片段(Java) | 机试题+算法思路+考点+代码解析 2023

客户和订阅之间的连接:Braintree API PHP

片段中的 getContext()