Regulární výrazy nahrazování znaků php. PHP regulární výrazy. Vyloučené třídy postav

PHP, jak se na moderní programovací jazyk sluší, nabízí vývojáři sadu funkcí pro použití regulárních výrazů. Výskyty řetězců v jiných řetězcích můžete hledat pomocí složitých kritérií.

  • PREG_PATTERN_ORDER;
  • PREG_SET_ORDER.

Seřadit podle možnosti 1 seskupuje výsledky hledání podle čísla regulárního výrazu (výchozí). Ve druhém případě jsou výsledky seskupeny podle jejich umístění v řádku.

Symbol - prvek šablony

Je důležité si uvědomit, že šablona pracuje se symboly. Programování už dávno zapomnělo, co je datový typ „znak“. Moderní jazyky nejdou pod pojem „řetězec“, ale s ohledem na vzor musíte pochopit: zde se manipuluje se symboly.

Sestavení šablony je v první řadě určení požadované sekvence znaků. Pokud tomu jasně rozumíte, pak v šabloně nebudou žádné chyby. V každém případě to bude mnohem méně.

  • a je specifický prvek šablony - symbol.
  • a-z je prvek šablony, také jeden znak, ale pouze s hodnotou od a do z - celá latinka je malá.
  • 0-9 je jedno číslo, libovolné číslo, ale 1-3 je pouze 1, 2 nebo 3.

Velikost písmen ve vzoru je důležitá. První a poslední znak vzoru jsou významné. Můžete určit, kde šablona začíná a končí.

Šablona funkce

PHP preg match all používá standardní syntaxi regulárních výrazů. uveďte jeden ze symbolů v nich uvedených:

  • pouze znaky a, b, c.
  • [^ABC] vše kromě znaků A, B, C.
  • \w a \W - textový nebo netextový znak.
  • \s a \S - mezera nebo znak bez mezer.
  • \d a \D - číslice nebo nečíslice.

Opakované znaky jsou označeny složenými závorkami - (n,m) a odkazují na předchozí znak.

  • n označuje opakování "ne méně než";
  • m - opakování "už ne".

Syntaxe poskytuje mnoho možností pro vytváření šablon, ale nejlepší je začít se základy, tedy s jednoduchými napsanými vlastní rukou, ve kterých chybí složité prvky a kombinace.

Jednoduše řečeno, uvedením skutečných znaků, které jsou potřeba, uvedením jejich požadovaného množství a přihlédnutím k tomu, že znak „^“ odpovídá začátku a „$“ konci řádku, můžete vytvořit jednoduché šablony. Analýzou skutečných, dobře odladěných regulárních výrazů od kvalifikovaných odborníků můžete získat solidní znalosti pro vytváření komplexních aplikací preg match all. Arzenál PHP se neomezuje pouze na tyto dvě funkce, ale jsou nejčastěji používané.

Jednoduchá praxe

Vzor celého čísla:

  • "/*/"

Také celočíselný vzor, ​​ale vpředu může být znak ("+", "-") a vpředu/vzadu mohou být mezery navíc:

  • /^[\s|\+|\-](0,1)*/

Rovněž:

  • /^[\s|\+|\-](0,1)*(\.)*/ - číslo s tečkou.
  • /+@+\.(2,3)/ - volba pro rozpoznání e-mailu.

Použití vlastních šablon pro preg match all, jejich příklady na internetu, analýza kódu webových stránek a dalších zdrojů vám umožní vytvořit si vlastní knihovnu šablon.

Možností vyhledání informací je mnoho. Zejména poslední dvě výše uvedené konstrukce mohou být modelovány odlišně. V mnoha případech bude dána přednost šabloně, která poskytuje požadovanou shodu rychleji a přesněji. Používání preg match all v PHP, stejně jako podobných funkcí v jiných jazycích, vyžaduje cvik, pozornost a předběžnou kontrolu správnosti šablon.

Tento článek poskytuje výběr příkladů regulárních výrazů php. Velmi pěkná a užitečná sbírka příkladů regulárních výrazů. Všechny příklady regulárních výrazů jsou přijatelné pro PHP. Užijte si to pro své zdraví!

Příklad ověření názvu domény

Tento fragment php zkontroluje, zda je řetězec platným názvem domény.

?:.*)+):?(d+)?/?/i", $url)) ( echo "Vaše url je v pořádku."; ) else ( echo "Chybná url."; )

Příklad zvýraznění slova v textu

Velmi užitečný regulární výraz pro vyhledávání a zvýraznění požadovaného slova v textu. Kód je užitečný zejména při vytváření výstupu výsledků vyhledávání.

$text = "Ukázka věty z KomunitasWeb, regulární výraz se stal populárním ve webovém programování. Nyní se učíme regulární výrazy. Podle wikipedie jsou regulární výrazy (zkráceně regulární výraz nebo regulární výraz, s tvary množného čísla regulární výrazy, regulární výrazy nebo regulární výrazy) psány ve formálním jazyk, který lze interpretovat procesorem regulárních výrazů“; $text = preg_replace("/b(regex)b/i", " 1", $text); echo $text;

Příklad implementace zvýraznění výsledků vyhledáváníWordPress

Otevřete soubor search.php a najděte funkci the_title(). Nahraďte jej následujícím řádkem:

Echo $title;

Nyní před nahrazený řádek vložte tento kód:

\0", $title); ?>

Uložte soubor search.php a otevřete style.css. Přidejte k němu následující řádek:

Strong.search-excerpt ( background: yellow; )

Příklad získávání obrázků zHTML metoda regulárních výrazů

Tento kus kódu PHP pomocí regulárních výrazů vyhledává všechny obrázky a jejich adresy URL.

$obrazky = pole(); preg_match_all("/(img|src)=("|")[^"">]+/i", $data, $media); unset($data); $data=preg_replace("/(img|src)("|"|="|=")(.*)/i","$3",$media); foreach($data as $url) ( $info = pathinfo($url); if (isset($info["rozšíření"])) (($info["rozšíření"] == "jpg") || ($info["rozšíření"] == "jpeg") || ($info["rozšíření"] == "gif") || ($info["rozšíření"] == "png")) array_push($ obrázky, $url); ))

Odstranění duplicitních slov (nerozlišují se malá a velká písmena)

Jsou slova, která se často opakují? Pak se vám bude hodit tento příklad regulárního výrazu.

$text = preg_replace("/s(w+s)1/i", "$1", $text);

Odstranění duplicitních bodů

To samé, jen s opakujícími se body.

$text = preg_replace("/.+/i", ".", $text);

Shoda značek XML/HTML

Tato jednoduchá funkce vyžaduje dva argumenty: značku (kterou chcete porovnat), xml nebo html kód.

Funkce get_tag($tag, $xml) ( $tag = preg_quote($tag); preg_match_all("(<".$tag."[^>]*>(.*?).")", $xml, $odpovídá, PREG_PATTERN_ORDER); vrátit $ shoduje se; )

Vyhledejte značky XHTML/XML se specifickými hodnotami atributů

Tento příklad je podobný předchozí funkci, jen můžete výrazně rozšířit vyhledávání, například najít

.

Funkce get_tag($attr, $value, $xml, $tag=null) ( if(is_null($tag)) $tag = "\w+"; jinak $tag = preg_quote($tag); $attr = preg_quote($ attr); $value = preg_quote($value); $tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*". "(["\"])$value\\2[^>]*>(.*?)<\/\\1>/" preg_match_all($tag_regex, $xml, $matches, PREG_PATTERN_ORDER); return $matches; )

Hledání hexadecimálních hodnot barev

Skvělý příklad regulárního výrazu, který odpovídá hexadecimálním hodnotám barev v daných řetězcích. k čemu to je? Možná chcete napsat službu komprese kódu CSS nebo něco podobného.

$string = "#555555"; if (preg_match("/^#(?:(?:(3))(1,2))$/i", $string)) ( echo "příklad 6 úspěšný."; )

Příklad vyhledávánítitulek na dané stránce

Tento zajímavý příklad PHP kódu s regexpem najde a vrátí text mezi tagy A.

Feof($fp))( $page .= fgets($fp, 4096); ) $titre = eregi(" (.*)",$page,$regs); echo $regs; fclose($fp);

Analýza protokolu Apache

Většina webů běží na známých serverech Apache. Pokud na něm běží i váš web, můžete protokol serveru analyzovat pomocí php regexp.

//Protokoly: Webový server Apache //Úspěšné zásahy pouze do souborů HTML. Užitečné pro počítání počtu zobrazení stránky. "^((?#IP klienta nebo název domény)S+)s+((?#základní ověření)S+s+S+)s+[((?#datum a čas)[^]]+)]s+"(?: GET|POST|HEAD) ((?#file)/[^ ?]+?.html?)??((?#parameters)[^ ?]+)? HTTP/+"s+(?#stavový kód)200s+((?#přenesených bajtů)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#uživatelský agent )[^"]*)"$" //Protokoly: Webový server Apache //404 pouze chyby "^((?#IP klienta nebo název domény)S+)s+((?#základní ověření)S+s+S+) s+[(?#datum a čas)[^]]+)]s+"(?:GET|POST|HEAD) ((?#soubor)[^ ?"]+)??((?#parametry)[ ^ ?"]+)? HTTP/+"s+(?#stavový kód)404s+((?#přenesených bajtů)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#uživatelský agent )[^"]*)"$"

Příklad kontroly složitosti hesla

Vynikající příklad regulárního výrazu, který kontroluje úroveň složitosti hesla. Heslo musí mít 6 znaků a obsahovat alespoň jedno velké písmeno, jedno malé písmeno a číslo.

"A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?) [-_a-zA-Z0-9](6,)z"

Nahrazení textových emotikonů grafickými emotikony

Tento příklad kódu změní textový emotikon na váš grafický. Zajímavý a užitečný fragment PHP.

$texte="Text se smajlíkem:-)"; echo str_replace(":-)"," ",$texte);

Příklad regulárního výrazu, ze kterého lze získat obrázkyhtml kód

Stojí za zmínku, že tento php kód se používá ve wordpressu k vyhledávání a zpracování obrázků.

post_content; $szSearchPattern = "~ ]* />~"; // Spusťte preg_match_all, chcete-li získat všechny obrázky a uložit výsledky do $aPics preg_match_all($szSearchPattern, $szPostContent, $aPics); // Zkontrolujte, zda máme alespoň 1 obrázek $iNumberOfPics = count($aPics); if ($iNumberOfPics > 0) ( // Zde můžete zpracovat své obrázky // V tomto příkladu budou jednoduše zobrazeny na monitoru po dobu ($i=0; $i< $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>

Doufám, že vám tato sbírka příkladů php regexp byla užitečná. Pokud jsou zajímavé doplňky nebo příklady regulárních výrazů (php), napište do komentářů.

Popis funkce:

Funkce preg_replace hledá shody regulárního výrazu (vzoru) s daty v řetězci (předmět) a nahradí je daty nalezenými v nahrazení.

Argument

Popis

vzor

Povinný argument. Regulární výraz (vyhledávací vzor)

řetězec, pole

výměna, nahrazení

Povinný argument.Řetězec nebo pole obsahující data používaná k nahrazení dat v předmět

Pro odkazy lze také použít konstrukci ve tvaru \$(1), což je ekvivalent \$1, tato konstrukce se použije, pokud za odkazem bezprostředně následuje číslo (\$(1)1).

řetězec, pole
předmět Povinný argument.Řetězec nebo pole obsahující data, která budou nahrazena. řetězec, pole
omezit

Volitelný argument. Maximální počet střídání. Výchozí hodnota je -1 (neomezeno)

int
počet

Volitelný argument. Proměnná, která obsahuje počet provedených náhrad.

int

Funkci preg_replace() lze použít s modifikátorem /e. Pokud je tento modifikátor přítomen, parametr nahrazení je interpretován jako kód PHP a poté použit pro nahrazení.

Regulární výrazy

Samostatně bychom se měli zastavit u regulárních výrazů, bez jejichž pochopení je docela obtížné (ne-li nemožné) porozumět práci funkce preg_replace().

Poměrně dobrý popis regulárních výrazů je uveden na wikipedia.org, popsány jsou i hlavní body používání regulárních výrazů

Příklady:

Příklad 1:

V tomto příkladu nahradíme všechna čísla umístěná v závorkách hvězdičkami.

Příklad 2:

V tomto příkladu nahradíme řetězec odpovídající celému vzoru daty odpovídajícími prvnímu dílčímu vzoru v odkazu \$1. Jinými slovy, „mít 3 jablka“ odpovídající „/(\w+) (\d+) (\w+)/“ bude nahrazeno „mít“ odpovídající (\w+).

Příklad 3:

Tento příklad ukazuje, co se stane, když použijete pole jako vzor a náhradu.

Příklad 4:

Tento příklad ukazuje, co se stane, když použijete pole jako vzor, ​​náhradu a předmět.

Příklad 5:

Tento příklad ukazuje použití modifikátoru /e, tj. když je nahrazení interpretováno jako php kód. Níže je převod znaků z malých na velká písmena.

Příklad 6:

Tento příklad ukazuje použití argumentu počet. Zde bude výsledek roven 2, takže došlo ke dvěma nahrazením.

smíšený preg_match(vzor řetězce, předmět řetězce [, pole &odpovídá [, příznaky int [, posun int]]])

Vyhledá v daném předmětu textu shodu se vzorem

Pokud je zadán parametr další shody, bude vyplněn výsledky vyhledávání. Element $matches bude obsahovat část řetězce, která odpovídá celému vzoru, $matches bude obsahovat část řetězce, která odpovídá prvnímu dílčímu vzoru atd.

příznaky mohou nabývat následujících hodnot:

PREG_OFFSET_CAPTURE

Pokud je zadán tento příznak, bude pro každý nalezený podřetězec uvedena jeho pozice ve zdrojovém řetězci. Je důležité si zapamatovat, že tento příznak mění formát vrácených dat: každý výskyt je vrácen jako pole, jehož nultý prvek obsahuje nalezený podřetězec a první prvek obsahuje offset. Tento příznak je dostupný v PHP 4.3.0 a vyšších.

Další parametr flags je dostupný od PHP 4.3.0.

Vyhledávání se provádí zleva doprava, od začátku řádku. Volitelný parametr offset lze použít k určení alternativní počáteční pozice pro vyhledávání. Dodatečný parametr offset je dostupný od PHP 4.3.3.

Komentář: Použití parametru offset není ekvivalentní nahrazení shodného řetězce řetězcem substr($subject, $offset) při volání funkce preg_match_all(), protože vzor může obsahovat podmínky jako např ^ , $ nebo (? . Porovnat:

Zatímco tento příklad

Funkce preg_match() vrátí počet nalezených shod. Může to být 0 (nenalezeny žádné shody) a 1 protože preg_match() přestane fungovat po první nalezené shodě. Pokud potřebujete najít nebo spočítat všechny shody, měli byste použít funkci preg_match_all(). Funkce preg_match() se vrací NEPRAVDIVÉ v případě, že se během provádění vyskytnou nějaké chyby.

Vodítko: Funkci nepoužívejte preg_match(), pokud potřebujete zkontrolovat přítomnost podřetězce v daném řetězci. Použijte k tomu strpos() nebo strstr(), protože tento úkol dokončí mnohem rychleji.


Příklad 2. Vyhledejte v textu slovo „web“.

/*
Speciální posloupnost \b ve vzoru znamená hranici slova,
proto bude odpovídat pouze izolovaný výskyt slova "web".
maska, na rozdíl od „pavučiny“ nebo „pavučiny“.
*/
if (preg_match("/\bweb\b/i" , "PHP je preferovaný webový skriptovací jazyk.")) {
echo "Záznam nalezen.";
) jinak (
echo "Nebyl nalezen žádný záznam.";
)preg_match ("/\bweb\b/i" , "PHP je vybraný skriptovací jazyk webových stránek.")) {
echo "Záznam nalezen.";
) jinak (
echo "Nebyl nalezen žádný záznam.";
}
?>

Už dlouho jsem chtěl porozumět regulárním výrazům. I když „přijít na to“ je silné slovo. Abyste zvládli velké umění stát se mistrem regulárních výrazů, musíte s nimi neustále pracovat. Nestačí se naučit syntaxi, speciální znaky a modifikátory – musíte je umět používat. A schopnost používat přichází se zkušenostmi.

V tomto příspěvku uvedu příklady použití regulárních výrazů, jejichž práci jsem sám rozuměl.

Tabulka speciálních znaků

Zvláštní charakter Popis
\ Symbol útěku. Příklad: „/seo\/smo/“- odpovídá řádku, který obsahuje seo/smo.
^ Začátek datového symbolu. Příklad: '/^seo/'— odpovídá řádku, který začíná slovem seo.
$ Konec datového symbolu. Příklad: „/blog$/“— odpovídá řádku, který končí slovem blog.
. Jakýkoli znak jiný než odřádkování. Příklad: '/seo.ult/'- odpovídá řetězci seopult, seo9ult, seo@ult atd.
Uvnitř těchto závorek jsou uvedeny znaky, z nichž kterýkoli se může objevit na daném místě, ale pouze jeden. Příklad: '/seoult/'— porovnány budou pouze řádky obsahující seopult, seokult nebo seomult.
| Nebo. Příklad níže.
() Submaska.
? Jeden nebo žádný výskyt předchozího znaku nebo dílčího vzoru.
* Libovolný počet výskytů předchozího znaku nebo dílčího vzoru. Včetně nuly.
+ Jeden nebo více výskytů.
Příklad: ‘/se+(op|om)?.*t/’- písmeno s, dále jedno nebo více písmen e, za nimiž se kombinace op nebo om může objevit jednou, možná ani jednou, dále libovolný počet libovolných symbolů a písmeno t.
(a,b) Počet výskytů předchozího znaku nebo dílčího vzoru od a do b. Příklad: (0,) - totéž jako *, (0,1) - totéž jako ?, (3,5) - 3, 4 nebo 5 opakování.

Jednoduché příklady PHP skriptů využívajících regulární výrazy:

1) Předchozí a následující výrazy.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // najde slovo, ve kterém ing následuje po Boxu. Pokud je slovo nalezeno, funkce vrátí true, pokud ne, false.$pattern1 = "/Box(?=ing)/" ; preg_match($pattern1, "Box Day"); // false preg_match ($pattern1, "Boxing Day" ) ; // skutečný // najít slovo, které nemá ing za rámečkem. Pokud je slovo nalezeno, funkce vrátí true, pokud ne, false.$pattern2 = "/box(?!ing)/" ; preg_match($pattern2, "Box pro iPhone a iPad"); // true preg_match ($pattern2, "Co je boxerský den?") ; // false preg_match ($pattern2, "css-moz-box-shadow" ) ; // skutečný // najde slovo, kde před ing není rámeček. Pokud je slovo nalezeno, funkce vrátí true, pokud ne, false.$pattern3 = "/(?

[^<]+?~","seo blog",$text); echo $text; ?>

3) Získejte a zobrazte hodnotu Alexa Rank daného webu.

1 2 3 4 5 6 7 8 9 "#
(.*?)
#si", file_get_contents ( "http://www.alexa.com/siteinfo/($url)"), $a ); return trim (str_replace ("," , "" , strip_tags ($a [ 1 ] ) ) ) ; ) $alexa = alexa($url) ; echo $alexa ; ?>

(.*?)

#si", file_get_contents("http://www.alexa.com/siteinfo/($url)")), $a); return trim(str_replace(",",","strip_tags($a))); ) $alexa = alexa($url); echo $alexa; ?>

4) Získejte a zobrazte název stránky.

1 2 3 4 5 (.*)<\/title>/s" , $str , $m ); echo $m [ 1 ] ; ?>

(.*)<\/title>/s", $str, $m); echo $m; ?>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 \n \r \t ]/", "", $obsah); // nahraďte znaky nového řádku a tabulátoru mezerami$obsah = preg_replace ("/(2,)/" , " " , $obsah ) ; // nahraďte více než 2 mezery jednou preg_match_all("/ ]*href=(?:"| \" )(.*)(?:"|\" )[^<>]*>(.*)<\/a>/iU", $obsah , $odkazy ); // sbírat odkazy if (sizeof ($links [ 1 ] ) > 0 ) // pokud jsou nalezeny odkazy( $out = pole () ; // pole externích odkazů foreach ($links [ 1 ] jako $v ) ( if (preg_match ("/http:\/\/(www\.)(0,1)" . $domain . "/i" , $v) ) // vyřazení interních odkazů( pokračovat ; ) if ( preg_match ( "/(http:|https:)?\/\/(www\.)(0,1)(.*)/i", $v)) // externí odkaz( $out = $v ; ) ) return $out ; ) return pole () ; ) $doména = "stránka" ; $obsah = file_get_contents ("http://site/" ) ; $getoutlinks = getoutlinks($obsah, $doména) ; pro ($i = 0; $i<= count ($getoutlinks ) ; $i ++ ) { echo $getoutlinks [ $i ] . "
" ; } ?>

]*href=(?:"|\")(.*)(?:"|\")[^<>]*>(.*)<\/a>/iU", $content, $links); // shromažďovat odkazy if (sizeof($links) > 0) // pokud jsou odkazy nalezeny ( $out = array(); // pole externích odkazů foreach ($links as $v ) ( if (preg_match("/http:\/\/(www\.)(0,1)".$domain."/i", $v)) // vyřadit interní odkazy (pokračovat; ) if (preg_match ("/(http:|https:)?\/\/(www\.)(0,1)(..com/"); $getoutlinks = getoutlinks($content, $domain); for ( $i = 0; $i<= count($getoutlinks); $i++) { echo $getoutlinks[$i]."
"; } ?>

Kde:
preg_replace— Provádí vyhledávání a nahrazování pomocí regulárního výrazu.
preg_match— provede kontrolu proti regulárnímu výrazu.
preg_match_all— najde všechny shody, zatímco preg_match najde pouze první.
file_get_contents— získat obsah souboru jako jeden řádek.
oříznout— odstraní mezery na začátku a konci řádku.
str_replace— nahradí hledaný řetězec náhradním řetězcem.
strip_tags— odstraní značky html a php z řetězce.
velikost— získá počet prvků v proměnné.
počet— počítá počet prvků pole nebo počet vlastností objektu.