2011-02-02 15 views
8

tengo una cadena que parece:PHP: eliminar `http: //` del título del enlace

$string = '<a href="http://google.com">http://google.com</a>';

¿Cómo puedo eliminar la parte http:// del texto del enlace, pero se deja en el href ¿atributo?

+0

que podrían encontrar [ 's ($ str) -> replaceLast ('http: //') '] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L305) útil, como se encuentra en [esta versión independiente biblioteca] (https://github.com/delight-im/PHP-Str). – caw

Respuesta

11

Sin utilizar un analizador completo soplado, esto puede hacer el truco para la mayoría de las situaciones ...

$str = '<a href="http://google.com">http://google.com</a>'; 

$regex = '/(?<!href=["\'])http:\/\//'; 

$str = preg_replace($regex, '', $str); 

var_dump($str); // string(42) "<a href="http://google.com">google.com</a>" 

Utiliza un negativo de búsqueda hacia atráspara asegurarse de que no hay href=" o href=' precede.

See it on IDEone.

También tiene en cuenta las personas que delimitan sus valores de atributo con '.

+0

que funciona, tx. buen sitio este ideone, en realidad puedes ejecutar el código php en él :) – Alex

+0

@Alexandra ¡No te preocupes, es una buena pregunta! – alex

9
$string = '<a href="http://google.com">http://google.com</a>'; 
$var = str_replace('>http://','>',$string); 

Sólo probamos esto en IDEone.com y tiene el efecto deseado.

+1

@ardman ... PHP ?? !!! ¡El infierno debe haberse congelado! –

+2

Simplemente vale la pena tirar por ahí, esto no captará '> http: // ...', pero si recorta los espacios de antemano esto debería hacerlo. – Robert

+0

no sé por qué pero no funciona, obtengo una cadena vacía .. – Alex

1
$string = '<a href="http://google.com">http://google.com</a>'; 
$var = explode('http://',$string); 
echo $var[2]; 
2

Cualquier expresión regular simple o código de reemplazo de cadena probablemente fallará en el caso general. La única forma "correcta" de hacerlo es analizar realmente el fragmento como un fragmento de SGML/XML y eliminar el http:// del valor.

Para cualquier otro código de manipulación de cadenas (razonablemente corto), encontrar un contraejemplo que lo rompa será bastante fácil.

+0

Bueno, la forma incorrecta es aún más apropiada. No hay suficiente potencial de caso límite para garantizar el uso de la solución de exceso (analizador html) aquí. Una expresión regular es suficiente. (La expresión no regex para html es algo anticuada.) – mario

+1

El "meme" de un hombre es la corrección de otro hombre.No sabemos cuán importante es que esto funcione todo el tiempo, o cuán confiable pueda ser la información. Regex probablemente funcione, pero no quiero darle a @Alexandra la impresión de que su problema se resolvió para cada entrada posible. –

2

Suponiendo que "http: //" siempre aparece dos veces en $ cadena, busque la cadena de "http: //" al revés usando strripos. Si la búsqueda tiene éxito, sabrá el start_index del "http: //" que desea eliminar (y usted sabe la duración del curso). Ahora puede usar substr para extraer todo lo que sucede antes y después del fragmento que desea eliminar.

4

En este caso simple, la función preg_replace probablemente funcione. Para mayor estabilidad, trate de usar DOMDocument:

$string = '<a href="http://google.com">http://google.com</a>'; 
$dom = new DOMDocument; 
$dom->loadXML($string); 

$link = $dom->firstChild; 
$link->nodeValue = str_replace('http://', '', $link->nodeValue); 
$string = $dom->saveXML($link); 
+0

Solo como un caso extremo, es posible que desee utilizar expresiones regulares para asegurarse de que se descuelgue solo desde el principio, ¿qué tal un enlace como 'http://example.com/send-to-friend?url=http:// somewhere.com'? Además, +1 para usar un analizador. – alex

3
$str = 'http://www.google.com'; 
$str = preg_replace('#^https?://#', '', $str); 
echo $str; // www.google.com 

que funcione para ambas http: // y https: //

running live code

Cuestiones relacionadas