Как отличить & lt; div & gt; от & lt;? php? & gt; используя PHP регулярных выражений?

Как отличить <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);

-1

Решение

ответ на свой первый вопрос:

(‘получить содержание <что-то> но не из <? 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!

Надеюсь, это поможет!

1

Другие решения

Кажется, регулярное выражение работает, просто оно не печатает <?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
1

По вопросам рекламы [email protected]