Я пытаюсь захватить строку в строке с помощью регулярного выражения.
Я посмотрел и посмотрел, но я не могу найти ни одного из примеров, которые я должен работать.
Мне нужно захватить html-теги <code> и </ 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 = "/<code\s*(.*)\>(.*)<\/code>/"; $regex = "/<code>(.*)<\/code>/";
$regex = '#<code>(.*?)</code>#';
Использование #
в качестве разделителя вместо /
потому что нам не нужно скрывать /
in </code>
Как Феникс опубликовал ниже,. .*?
используется для того, чтобы сделать .*
(«ничего») как можно меньше символов, прежде чем он натолкнется на </code>
(известный как «не-жадный квантификатор»). Таким образом, если ваша строка
<code>hello</code> something <code>again</code>
вы встретите hello
и again
вместо того, чтобы просто совместить hello</code> something <code>again
.
Вы можете использовать следующее:
$regex = '#<\s*?code\b[^>]*>(.*?)</code\b[^>]*>#s';
\b
гарантирует, что опечатка (например, <codeS>
) не будет захвачена. [^>]*
фиксирует содержимое тега атрибутами (например, классом). См. Результат здесь: http://lumadis.be/regex/test_regex.php?id=1081
эта функция работала для меня
<?php function everything_in_tags($string, $tagname) { $pattern = "#<\s*?$tagname\b[^>]*>(.*?)</$tagname\b[^>]*>#s"; preg_match($pattern, $string, $matches); return $matches[1]; } ?>
вы можете использовать /<code>([\s\S]*)<\/code>/msU
этот catch NEWLINES тоже!
function contentDisplay($text) { //replace UTF-8 $convertUT8 = array("\xe2\x80\x98", "\xe2\x80\x99", "\xe2\x80\x9c", "\xe2\x80\x9d", "\xe2\x80\x93", "\xe2\x80\x94", "\xe2\x80\xa6"); $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("\r\n", "\n", $text); $text = str_replace("\r", "\n", $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("\n\n", '</p><p>', $text) . '</p>'; $text = str_replace("\n" , '<br />', $text); $text = str_replace('</p><p>', '</p>' . "\n\n" . '<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("\n\n", '</p><p>', $text) . '</p>'; $text = str_replace("\n" , '<br />', $text); $text = str_replace('</p><p>', '</p>' . "\n\n" . '<p>', $text); } return $text; }