Версия, подходяща за принтиране
Кликни тук, за да видиш темата в оригиналният и вид
BG Development Форуми > PHP/Perl/Python/ASP > Малко помощ за REGEX


Публикувано от: nullsoft 30-03-2021, 18:29
Имам следния код

CODE
preg_match_all('#<div class="quizAnswerContainer">\s(.*?)<div class="quizStatsContainer">#smi', $get, $go);



print_r($go[1])

показва следния код

CODE


Array
(
   [0] =>            
                 <div class="quizSingleAnswer quizAnswerRow_1  answerGiven answerIncorrect" onclick="quizFunc.quizQuestionToggleAnswer('1');">
                   
                   <div class="quizAnswerPosition">A</div>
                   <div class="quizAnswerText">
                     In Kanada
                       
                         <div class="quizAnswerIconOuter"><div class="quizAnswerIcon"><img src="https://s3-eu-west-1.amazonaws.com/pocket-s3/portal_quiz/wrong_white.png"/></div></div>
                       
                   </div>
                 </div>
                 <div class="quizSingleAnswer quizAnswerRow_2  " onclick="quizFunc.quizQuestionToggleAnswer('2');">
                   
                   <div class="quizAnswerPosition">B</div>
                   <div class="quizAnswerText">
                     In Algerien
                       
                   </div>
                 </div>
                 <div class="quizSingleAnswer quizAnswerRow_3  answerNotGiven answerCorrect" onclick="quizFunc.quizQuestionToggleAnswer('3');">
                   
                   <div class="quizAnswerPosition">C</div>
                   <div class="quizAnswerText">
                     In Russland
                       
                         <div class="quizAnswerIconOuter"><div class="quizAnswerIcon"><img src="https://s3-eu-west-1.amazonaws.com/pocket-s3/portal_quiz/right_green.png"/></div></div>
                       
                   </div>
                 </div>
                 <div class="quizSingleAnswer quizAnswerRow_4 quizLastAnswer " onclick="quizFunc.quizQuestionToggleAnswer('4');">
                   
                   <div class="quizAnswerPosition">D</div>
                   <div class="quizAnswerText">
                     In Indien
                       
                   </div>
                 </div>
         </div>
       </div>
     </div>

     
)


искам да взема само текста In Russland

кадето се намира ето в тоз код
CODE

<div class="quizAnswerText">
                     In Russland
                       
                         <div class="quizAnswerIconOuter"><div class="quizAnswerIcon"><img src="https://s3-eu-west-1.amazonaws.com/pocket-s3/portal_quiz/right_green.png"/></div>


не мога да взема този текст


Публикувано от: Антон Яначков 30-03-2021, 20:22
За да изолираш само този текст, ти трябва нещо уникално, което да го отличава от останалия. Това което виждам е, буквата С и за това аз бих извадил всичко което започва от нея включително търсения текст и завършва с <, чрез следния регулярен израз:

CODE

/C</div>\n\s+<div class=\"quizAnswerText\">\n[\n\s\w\.\,\?\!\;\:]+/g


След, което, чрез Replace бих заместил ненужния, но известен текст
C</div><div class="quizAnswerText"> с нищо и ще ти остане само търсения текст.
Можеш лесно да видиш как се случват нещата на този адрес:
https://regexr.com
Слагаш си своя текст, слагаш регулярния израз и виждаш какво ти е селектирано. Там е лесно и удобно за експерименти.

Регулярния израз трябва още малко да се пипне, ако в текста ще има някакви особени знаци или символи, примерно @ или нещо друго, но това лесно можеш да си го добавиш в правоъгълните скоби.





Публикувано от: nullsoft 30-03-2021, 20:33
QUOTE (Антон Яначков @ 30-03-2021, 20:22)
За да изолираш само този текст, ти трябва нещо уникално, което да го отличава от останалия. Това което виждам е, буквата С и за това аз бих извадил всичко което започва от нея включително търсения текст и завършва с <, чрез следния регулярен израз:

CODE

/C</div>\n\s+<div class=\"quizAnswerText\">\n[\n\s\w\.\,\?\!\;\:]+/g


След, което, чрез Replace бих заместил ненужния, но известен текст
C</div><div class="quizAnswerText"> с нищо и ще ти остане само търсения текст.
Можеш лесно да видиш как се случват нещата на този адрес:
https://regexr.com
Слагаш си своя текст, слагаш регулярния израз и виждаш какво ти е селектирано. Там е лесно и удобно за експерименти.

Регулярния израз трябва още малко да се пипне, ако в текста ще има някакви особени знаци или символи, примерно @ или нещо друго, но това лесно можеш да си го добавиш в правоъгълните скоби.


за момента е С но после може да е А Б и Д.

само това го отличава от другите

CODE
<img src="https://s3-eu-west-1.amazonaws.com/pocket-s3/portal_quiz/right_green.png"/>


всеки правилен отговор получава
CODE
https://s3-eu-west-1.amazonaws.com/pocket-s3/portal_quiz/right_green.png



аз пробшам по следния начин

CODE
preg_match_all('#<div class="quizAnswerContainer">\s(.*?) <div class="quizAnswerIconOuter"><div class="quizAnswerIcon"><img src="https:\/\/s3-eu-west-1.amazonaws.com\/pocket-s3\/portal_quiz\/right_green.png"\/>#smi', $get[1][0], $clean);


print_r($clean);

е празен

провах с

$clean = explode('<div class="quizAnswerText">', $go[1][0]);

при $clean[4] ми показва In Russland

пробвам с if preg_match да видя дали има right_green.png в array дава ми true но после не ми стигат пхп знанията как да искарам от коя цифра се получава true


Публикувано от: nullsoft 30-03-2021, 21:46
успях по следния начин

CODE
$clean = explode('<div class="quizAnswerText">', $go);


for ($i = 0; $i < 4; $i++) {


if (preg_match("/right_green.png/", $clean[$i])) {


preg_match('#(.*?)<div#smi', $clean[$i], $g);

print_r($g[0]);
}



}



Публикувано от: relax4o 31-03-2021, 01:53
https://symfony.com/doc/current/components/dom_crawler.html
https://simplehtmldom.sourceforge.io/

Публикувано от: thrawn 31-03-2021, 05:17
Html се парсване с dom парсер (който позволява директна манипулация на DOM) вместо с регулярни изрази.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)