Как отличить <div>
от <?php ?>
используя PHP регулярных выражений?
div
это просто пример. Мне нужно в <smth> <?php code ?> </smth>
различать smth
а также ?php code ?
где что-л и код может быть любой комбинацией символов.
Я хотел бы получить содержание <div>
, но не из <?php ? >
и иногда тиски против
$regex1 = '#<(?<!\?)(.*?)>#' ; // result : div , ?php ? , /div .
Мне не нужен php в этом случае.
$regex1 = '#<(?<!\??)(.*?)>#' ; //Compilation failed: lookbehind assertion is not fixed length at offset 8
Второй вопрос будет, как получить inside <?php ?>
внутри <div>
и подобная HTML-разметка
$htmlStr = " before <div> inside <?php ?> </div> after ";
$regex1 = '#(.*)' //before
. '<(?!\?)' // < not followed by ?
. '(.*)' // div
. '((?<!\?)>)'// > not preceeded by ?
. '(.*)' // Retrieves only 'inside', instead of 'inside <?php ? >'
. '</' // </
. '.*' // div
. '((?<!\?)>)' // > not preceeeded by ?
. '(.*)#'; // after
Я также пробовал не жадное выражение:
$regex1 = '#(.*)' //before
. '<(?!\?)' // < not followed by ?
. '(.*)' // div
. '((?<!\?)>)'// > not preceeded by ?
. '(.*?)' // // non-greedy expression fetch only 'inside', but i need 'inside <?php ? >'
. '</' // </
. '.*' // div
. '((?<!\?)>)' // > not preceeeded by ?
. '(.*)#'; // after
Окончательная настройка. DOM также не получает значение, если оно содержит. Код ниже строкиforeach ($els as $el) { echo '<br><br>element value ='. $el->nodeValue; }
отголоски inside
вместо inside <?php ?>
$htmlStr = " before <div> inside <?php ?> </div> after ";
$regex1 = '#(.*)<([a-zA-Z]+)>'// > not preceeded by ? [a-zA-Z]
. '(.*)' // greedy expression fetch only 'inside', but i need 'inside <?php ? >' (?=<\/)'
. '</' // </
. '[a-zA-Z]+' // div
. '(?<!\?)>' // > not preceeeded by ?
. '(.*)#'; // after */
preg_match_all($regex1, $htmlStr, $attrArr1, 0); //input
$attrArr1 = array_filter($attrArr1);
print_r('<br><br> 619 htmlStr=' . $htmlStr. ', attrArr1 = <pre>'); print_r($attrArr1);
$dom = new \DOMDocument('1.0'); // name, value
$dom->loadHTML($htmlStr);
$ansArr['elType'] = $attrArr1[2][0];
//$els = $dom->getElementsByTagName('*'); // To be done
$els = $dom->getElementsByTagName($ansArr['elType'] );
foreach ($els as $el) { echo '<br><br>element value ='. $el->nodeValue; } //gives value 'inside'
print_r('<br><br>620 elType='.$ansArr['elType'].', els='); print_r($els);
ответ на свой первый вопрос:
(‘получить содержание <что-то> но не из <? php?> ‘) демонстрация
input >> <smth id="test">Hello World!</smth><?php echo "Hello World!"?>
regex >> (?<=<smth\s)(.*?)(?=>)
output >> id="test"
ответ на второй вопрос:
(‘получить внутри <? php?> ‘) демонстрация
input >> <smth id="test">Hello World!</smth><?php echo "Hello World!"?>
regex >> (?<=<\?php\s)(.*?)(?=\?>)
output >> echo "Hello World!"
(‘получить внутри <smth> и аналогичная HTML-разметка ‘) демонстрация
input >> <smth id="test">Hello World!</smth><?php echo "Hello World!"?>
regex >> (?<=<smth[\s]id="test">).*?(?=<\/smth>) // not efficient
output >> Hello World!
Надеюсь, это поможет!
Кажется, регулярное выражение работает, просто оно не печатает <?php ?>
потому что это не строка в контенте веб-браузера. Тем не менее, если вы добавите текст после, вы получите все. Также, если вы напишите результат в файл, вы найдете не только слово inside
, но также inside <?php ?> smth
//$regex2 ='#(.*)<([a-zA-Z]+)(.*?)(?<!\?)>(.*)</[a-zA-Z]+(?<!\?)>(.*)#'; for textarea, also div/span/p/a and other elements having closing tags.
//$regex3 ='#(.*)<([a-zA-Z]+)(.*?)/>(.*)#'; //for input
// Textarea
$htmlStr2 = " before <textarea name='<?php ?>' > inside '<?php ? >' smth. </textarea> after ";
//$regex2 ='#(.*)<([a-zA-Z]+)(.*?)(?<!\?)>(.*)</[a-zA-Z]+(?<!\?)>(.*)#'; for textarea
$regex2 = '#(.*)<([a-zA-Z]+)' // > not preceeded by ? textarea[a-zA-Z]+
. '(.*?)' // attributes (.*?)
. '(?<!\?)>'// > not preceeded by ?
. '(.*)' // fetch <?php ? >
. '</' // </
. '[a-zA-Z]+' // div
. '(?<!\?)>' // > not preceeeded by ?
. '(.*)#'; // after
preg_match_all($regex2, $htmlStr2, $attrArr, 0); //input
$attrArr = array_filter($attrArr); //array_filter removes empty values
print_r('<br><br> 619 htmlStr=' . $htmlStr. ', attrArr1 = <pre>'); print_r($attrArr);
$resStr = print_r($attrArr, true);
print_r('<br><br> resStr='.$resStr);
file_put_contents('C:\\Users\\gintare\\Documents\\reg2.txt', $resStr);
$before = $attrArr1[1][0]; // before
$tagType = $attrArr1[2][0]; //input
$tagAttrStr = $attrArr1[3][0]; //name='<?php ? >'
$inside = $attrArr1[4][0]; //inside '<?php ? >' smth.
$afer = $attrArr1[5][0]; //after
//Input
$htmlStr3 = " before <input class='inp' > after '<?php ? >' smth. ";
//$regex3 ='#(.*)<([a-zA-Z]+)(.*?)/>(.*)#'; //for input
$regex3 = '#(.*)<([a-zA-Z]+)' // > not preceeded by ? input[a-zA-Z]+
. '(.*?)' // attributes (.*?)
. '/>'//
. '(.*)'; // after
preg_match_all($regex3, $htmlStr3, $attrArr, 0); //input
$attrArr = array_filter($attrArr); //array_filter removes empty values
print_r('<br><br> 619 htmlStr=' . $htmlStr. ', attrArr1 = <pre>'); print_r($attrArr);
$resStr = print_r($attrArr, true);
print_r('<br><br> resStr='.$resStr);
file_put_contents('C:\\Users\\gintare\\Documents\\reg3.txt', $resStr);
$before = $attrArr1[1][0]; // before
$tagType = $attrArr1[2][0]; //input
$tagAttrStr = $attrArr1[3][0]; //name='<?php ? >'
$after = $attrArr1[4][0]; //after