regex - preg_match_all - preg_match()
Coincidencia de patrón de múltiples líneas a través de PHP preg_match (5)
Debe eliminar todos los saltos de línea usando /s
en expresiones regulares.
$str ="<ol>
<li>Capable for unlimited product</li>
<li>Two currency support</li>
<li>Works with touch screens and click screen based systems</li>
<li>Responsive design <b>shopping cart</b>, Specially design for Mac, iPhone, iPad, PC and Android</li>
<li>VAT for countries that support a Value Added Tax</li>
<li>Barcode scanner checkout option for POS</li>
<li>mRSS</li>
</ol>";
preg_match("/^([A-Za-z0-9/s/</>/./,///-/ ]+)$/",$str);
//Sanitize your code before save to database.
function test_input($data) {
$data = trim($data);
$data = htmlspecialchars($data);
$data = json_encode($data);
$data = addslashes($data);
return $data;
}
echo test_input($str);
¿Cómo puedo hacer coincidir el tema a través del patrón de expresión regular de preg_match de PHP en este código HTML:
<table border=0>
<tr>
<td>
<h2>subject</h2>
</td>
Todos los espacios en blanco y las nuevas líneas se dejan a propósito. Entonces, ¿el problema está en extraer el nombre del sujeto usando un patrón de varias líneas?
Muy simple con
preg_match(''/<h2>(.*?)<///h2>/'', $str, $matches);
print($matches[1]);
El formato de multilínea no tiene efecto en la expresión regular a menos que necesite unir una cadena que abarque varias líneas.
No debes usar expresiones regulares para analizar html. Puede causar muchos problemas si no puede controlar lo que el usuario puede ingresar. Hay muchas mejores soluciones en todos los idiomas. El analizador XML en la mayoría de los casos está haciendo un mejor trabajo. echa un vistazo a DOMDocument , simplehtmldom o php-html-parser
Consulte aquí para obtener más respuestas sobre por qué no debería usar expresiones regulares en html: RegEx coincide con las etiquetas abiertas excepto las etiquetas autocontenidas XHTML
Puede agregar el operador m
a su expresión regular:
// Given your HTML content.
$html = ''Your HTML content'';
preg_match(''/<td[^>]*>(.*?)<//td>/im'', $html, $matches);
Espero que esto (todavía) ayude, jajaja.
Si está buscando (por ejemplo) una etiqueta h2
anidada dentro de una etiqueta td
donde solo hay espacios en blanco entre los dos, simplemente use /s
que incluye espacios, nuevas líneas, etc.
preg_match(''#<td>/s*<h2>(.*?)</h2>/s*</td>#i'',$str,$matches);
// result is in $matches[1]
Véalo en acción aquí .
Para su interés, here hay una lista de diferentes modificadores que puede pasar a las funciones preg_*
. Las banderas que te pueden interesar son:
s
("dotall"): éste lo hace.
coincide con todos los personajes, incluidas las nuevas líneas. Entonces, digamos que su<h2>.....</h2>
se extendió en varias líneas. Entonces tendrías que hacerpreg_match(''#<td>/s*<h2>(.*?)</h2>/s*</td>#is'',$str,$matches);
para que el
.*
pase por varias líneas (¿ve lass
adicionales al final de la expresión regular?).-
m
("multilínea"): esta solo permite que^
y$
coincidan con el inicio / final de línea en lugar de solo el inicio / final de la cadena . Solo lo necesita si está utilizando^
y$
en su patrón y desea que coincidan con el inicio / final de cada línea individual en su entrada.