Marcin Lewandowski

Marcin Lewandowski Programista
PHP/MySQL,
poszukuję...

Temat: [PHP][Wyrażenie regularne] Pobranie wartości z value pola...

Witam,

Napisałem proste wyrażenie regularne które wyciąga wartość elementu input o określonej nazwie:


function getInputValue($content, $name) {
preg_match_all('#<input[^>]*name="'.$name.'"[^>]*value="(.*?)"[^>]*?>#is',$content,$input);

echo '<pre>' . print_r($input, true) . '</pre>';
}


Niestety powyższy kod nie działa w przypadku gdy value znajduje się przed nazwą np.


<input value="test" type="text" name="imie">
<input type="text" VALUE="kowalski" name="nazwisko" class="text">


Dlatego też dokonałem modyfikacji, niestety modyfikacja nie przynosi oczekiwanych rezultatów. Może mógłby ktoś naprowadzić mnie na właściwy trop ?


function getInputValue($content, $name) {
preg_match_all('#<input[^>]*(value="(.*?)")?name="'.$name.'"[^>]*(value="(.*?)")?[^>]*>#is', $content, $input);

echo '<pre>' . print_r($input, true) . '</pre>';
}
Lukasz P.

Lukasz P. cascascacsasc

Temat: [PHP][Wyrażenie regularne] Pobranie wartości z value pola...

Witaj Marcin

poniżej proponuję ci moje rozwiązanie (pisałem na szybko, myslę że można by nad tym popracować)



function getInputValue($str){

$str = str_replace('\"', '{AAA}', $str);

preg_match_all('/(<input)(?P<str>.*)((\/)>)/', $str, $result);
$str = trim(current($result['str']));

preg_match_all('/((?P<name>[a-z]*?)="(?P<value>.*?)"(\s)*?)*?/',$str,$result);
$r = array();
foreach($result['name'] as $k => $v){
if(!empty($v)){
$r[$v] = str_replace('{AAA}','\"', $result['value'][$k]);
} }
$result = $r;
return $result;
}


działanie:


print_r(getInputValue('<input name="asc" value="ascas\"casc" attr="ascasca" />'));

Wynik:
Array
(
[name] => asc
[value] => ascas\"casc
[attr] => ascasca
)




Ogólnie procedurka rozbija na tablice asocjacyjną wszystkie argumenty.

Zrobiłem małe obejście problemu \", ale to widać w kodzie.

Szczerze mówiąc czekałem, aż ktoś napisze jakiś niebanalny problem na tym forum, gdzie "specjaliści" przez ponad godzinę nie będą umieli odpowiedzieć :)

Czy ktoś ma inne ciekawe rozwiązanie?

:)
Marcin Lewandowski

Marcin Lewandowski Programista
PHP/MySQL,
poszukuję...

Temat: [PHP][Wyrażenie regularne] Pobranie wartości z value pola...

Mateuszu,

Problemem nie jest wyciągnięcie samych danych, które mnie interesują. Bowiem to jestem w stanie zrobić bez problemu i mam funkcje która spełnia swoje zadanie.

Jednak zależało by mi na tym, aby jednym wyrażeniem wyciągnąć wartości dla pola o określonej nazwie. I tutaj pojawia się pytanie dlaczego moje wyrażenie tego nie robi bowiem sama koncepcja wydaje się poprawna.
Lukasz P.

Lukasz P. cascascacsasc

Temat: [PHP][Wyrażenie regularne] Pobranie wartości z value pola...

Z pewnością twoje wyrażenie nie było odporne na kolejność atrybutów i dlatego nie działało.

wyrażeniem

((?P<name>[a-z]*?)="(?P<value>.*?)"(\s)*?)*?


Zczytuje się wszystkie atrybuty z ich wartościami (tak jak to widać we wcześniejszym poście), tylko trzeba wcześniej je wyciągnąć - stąd też dwa wyrażenia.

Aby wyciągnąć pola o określonej nazwie wystarczy dodać jakiegos erega który sprawdzi czy to to pole.

Jednak jak tak sobie pomyślałem nad problemem to i Ty i ja zrobiliśmy bład - czyli koncepcja o której pisałeś.

Najlepiej do tego jest wykorzystać DOM'a, ewentualnie phpQuery (który opiera sie na domie).

W przypadku DOM kod by wyglądał tak


$html_string = '<html><head></head><body><input name="asc" value="ascas\'casc" attr="ascasca" /></body></html>';

function szukaj($html_string, $name){
$dom= new DOMDocument();
$dom->loadHTML($html_string); $domTable = $dom->getElementsByTagName("input");
foreach($domTable as $node){
if($node -> getAttribute('name') == $name)
return $node -> getAttribute('value');
}
return false;

}

print_r(szukaj($html_string,'asc'));



a w phpQuery pewnie coś takiego (trzeba by sprawdzić)


pq('input[name='.$name.']') -> val();


Napewno jest to bardziej zasobochłonne ale znacznie pewniejsze niż wyrażenia regularne (nie trzeba się zabezpieczać przed \" itp)

Także wydaje mi się, że lepsza była by koncepcja z użyciem DOM, a Twój kod po prostu nie był odporny na kolejność atrybutów.
Paweł G.

Paweł G. Managing Director

Temat: [PHP][Wyrażenie regularne] Pobranie wartości z value pola...

Najlepiej do tego jest wykorzystać DOM'a, ewentualnie phpQuery (który opiera sie na domie).

Albo php simple html.

konto usunięte

Temat: [PHP][Wyrażenie regularne] Pobranie wartości z value pola...

Marcin Lewandowski:
Witam,

Napisałem proste wyrażenie regularne które wyciąga wartość elementu input o określonej nazwie:


function getInputValue($content, $name) {
preg_match_all('#<input[^>]*name="'.$name.'"[^>]*value="(.*?)"[^>]*?>#is',$content,$input);

echo '<pre>' . print_r($input, true) . '</pre>';
}


Niestety powyższy kod nie działa w przypadku gdy value znajduje się przed nazwą np.


<input value="test" type="text" name="imie">
<input type="text" VALUE="kowalski" name="nazwisko" [/quote]> class="text">[quote]


Dlatego też dokonałem modyfikacji, niestety modyfikacja nie przynosi oczekiwanych rezultatów. Może mógłby ktoś naprowadzić mnie na właściwy trop ?


function getInputValue($content, $name) {
preg_match_all('#<input[^>]*(value="(.*?)")?name="'.$name.'"[^>]*(value="(.*?)")?[^>]*>#is', $content, $input);

echo '<pre>' . print_r($input, true) . '</pre>';
}

Organizuj szukanie dwustopniowo.

w pierwszym kroku znajdź cały <input /> o danej nazwie,
w kroku drugim wyłuskaj wartość "value".

Od razu mi się http://www.goldenline.pl/forum/php/1393240 to przypomniało... ;)Kuba Świegot edytował(a) ten post dnia 18.01.10 o godzinie 21:56
Daniel Częstki

Daniel Częstki senior php developer

Temat: [PHP][Wyrażenie regularne] Pobranie wartości z value pola...

Hej.

Użyj jQuery:

$("input[name='nazwaPola']").val();

:)Daniel Częstki edytował(a) ten post dnia 22.01.10 o godzinie 14:40

konto usunięte

Temat: [PHP][Wyrażenie regularne] Pobranie wartości z value pola...

Kuba Świegot:
Organizuj szukanie dwustopniowo.

w pierwszym kroku znajdź cały <input /> o danej nazwie,
w kroku drugim wyłuskaj wartość "value".

Od razu mi się http://www.goldenline.pl/forum/php/1393240 to przypomniało... ;)

złośliwy jesteś

http://www.goldenline.pl/forum/php/1412288/s/1#27352936

Autor chce to za jednym zamachem załatwić i myśli że ma poprawną koncepcjęPrzemysław R. edytował(a) ten post dnia 22.01.10 o godzinie 14:47
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: [PHP][Wyrażenie regularne] Pobranie wartości z value pola...

Koncepcja raczej jest poprawna. RegexCoach dopasowuje podany wzorzec bez względu na kolejność name i value.

konto usunięte

Temat: [PHP][Wyrażenie regularne] Pobranie wartości z value pola...

pokaż takiego RegExpa który za jednym zamachem wyłuszczę w dowolnym tekście to co trzeba bez zwracania uwagi na kolejność

jestem ciekaw jak by to wyglądało

dla ułatwienia tu jest toool online do testowania http://erik.eae.net/playground/regexp/regexp.html

edit, bo wklejam to co jest tu w wątku i mi maszyna głupieje
patrząc też na te wzorce w przypadku gdy zamiast znaku " będzie znak ' to też nie będzie pasować

to samo dotyczy sytuacji gdy będzie spacja między nazwą atrybutu a wartościąPrzemysław R. edytował(a) ten post dnia 22.01.10 o godzinie 19:24
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: [PHP][Wyrażenie regularne] Pobranie wartości z value pola...

Tu nie chodzi o dowolny tekst, tylko konkretny z dwoma przypadkami (value przed lub za nazwą).

Pod PHP jeszcze mocno nie testowałem, ale wstępne wygląda że sam wzorzec dopasowuje się poprawnie - zwracana tablica $input w indeksie 0 zawiera cały <input ... >, natomiast jakby gubiła się przy wzorcach wewnętrznych w nawiasach (test pod PHP 5.3.0)

Spacje i przypadek "' można wyeliminować (chyba) przez podanie zestawu znaków ['"] czy ustawić kolejne .*

[EDIT - to nie było back-reference; swoją drogą - jak to jest na polski?]Bartosz Ratajczyk edytował(a) ten post dnia 22.01.10 o godzinie 22:52

konto usunięte

Temat: [PHP][Wyrażenie regularne] Pobranie wartości z value pola...

rozwiązanie które jest dostosowane do konkretnego stringa jest takie sobie, bo jak coś się zmieni znalezienie przyczyny będzie trudne

rozwiązanie dwuetapowe ma tą poważną zaletę że charakteryzuje się większą odpornością na zmiany, przez co jak webmaster poprawi stronę i np, wskoczy cokolwiek przed, po lub nie będzie takiej tragedi

wadą jest większe skomplikowanie

spacja w regexpach to \s, w PHP powinno być chyba tak samo, ale trzeba sprawdzić
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: [PHP][Wyrażenie regularne] Pobranie wartości z value pola...

Masz rację - będzie bardziej zagmatwane. Ale zobacz o co chodzi w pytaniu: "dlaczego to nie działa", a nie "jak to zrobić inaczej".

Następna dyskusja:

wyrażenie regularne w mysql




Wyślij zaproszenie do