2010-08-26 17 views
6

¿Hay una manera fácil de sustituir un/una en una cadena de acuerdo con la siguiente palabra - lo mismo que la obra 'S' en formato de fecha manera?forma correcta del artículo indefinido (un, una) en las cadenas de PHP

p. Ej.

$apple = 'apple'; 
$pear = 'pear'; 
echo "This is a $apple, this is a $pear." 

--> This is an apple, this is a pear 
+1

Esto suena como un preg_replace usando una expresión regular condicional. Ver: http://www.regular-expressions.info/lookaround.html – Chris

+1

Ese es un excelente enlace. – Leo

+0

Esto NUNCA puede funcionar completamente :) Inglés aquí tiene demasiados escollos. P.ej. 'Una universidad' es la forma correcta, aunque la palabra comienza con un' u'. Lo mismo con 'an H ...' en muchos casos, si la consonante es silenciosa y no se habla. – mark

Respuesta

6

Prueba esto:

$l = array('a apple is a fruit', 'a banana is also a fruit'); 

foreach($l as $s) { 
    $s = preg_replace('/(^|)a ([aeiouAEIOU])/', '$1an $2', $s); 
    echo $s,"\n"; 
} 

de salida:

an apple is a fruit 
a banana is also a fruit 
+0

necesitaba usar [aeiouAEIOU] como lo es para un título donde las palabras importantes están en mayúscula. Gracias. – Leo

+0

Derecha, agregué las letras mayúsculas. – Toto

+4

Una universidad pasó una hora investigando una respuesta SO para encontrar cosas incorrectas ... –

2

no está seguro de si funciona en PHP de esa manera, sino una solución muy simple sería:

$string = preg_replace('/\ba\b\s([aeiou])/', 'an $1', $string); 
$string = preg_replace('/\ban\b\s([^aeiou])/', 'an $1', $string); 

(No estoy seguro sobre el a/una regla que no hay tal regla en alemán y yo generalmente utilice la que suena mejor)

Explicación:

\ b es un límite de palabra, por lo que \ BA \ b busca la palabra a, seguido de un espacio y una de las cartas [aeiou]. La carta es capturado a $ 1 y la expresión se reemplaza con an seguido de la letra capturado.

+1

Gracias - igual primer lugar con M42. – Leo

6

se puede utilizar una expresión regular para cambiar el a/y en función de lo que le sigue. La parte más difícil será realmente definiendo todos los casos en los que intercambiar - es más complicado 'si es seguido por una vocal'.

Al utilizar un/una:

Utilice un antes palabras/abreviaturas que comienzan con una consonante; antes de usar una palabra/abreviaturas que comienzan con un sonido vocal. Esto se basa en la pronunciación, no en la ortografía.

Por lo tanto:

  • una universidad
  • una hora
  • una molécula de iterbio
  • un perro amarillo
  • una U
  • un M

comienzo de una expresión regular para resolverlo

$text = preg_replace("/(?=a|e|i|o|u|yt)a/", "an", $text); 
+0

la expresión regular es incorrecta. afirma que comienza en la posición de un a. – muhmuhten

+3

Bah, mi punto era el lenguaje en lugar de la expresión regular/función utilizada, que es bastante simple. Hacer un intercambio básico según si 'a' es seguido por una vocal simplemente no es la forma correcta de un artículo indefinido. – danielgwood

+0

Has hecho algunos puntos interesantes. El uso común es la clave para esto. Un hotel es correcto, pero el uso real y la pronunciación dependen de en qué parte del país (Inglaterra) vienes, entre otras cosas. Por lo tanto, un hotel es igualmente correcto. Hacer otras distinciones, p. una universidad, un paraguas no se hace fácilmente algorítmicamente. – Leo

0

que utilizan la respuesta de Lucas Chaver escribir un fragmento de php rápida y desagradable que hacer manejar esta

<?php 
//code inspired by https://github.com/Kaivosukeltaja/php-indefinite-article/blob/master/IndefiniteArticle.class.php 
global $indef_A_abbrev, $indef_A_y_cons, $indef_A_explicit_an, $indef_A_ordinal_an, $indef_A_ordinal_a; 

$indef_A_abbrev = "(?! FJO | [HLMNS]Y. | RY[EO] | SQU 
      | (F[LR]? | [HL] | MN? | N | RH? | S[CHKLMNPTVW]? | X(YL)?) [AEIOU]) 
      [FHLMNRSX][A-Z] 
     "; 
$indef_A_y_cons = 'y(b[lor]|cl[ea]|fere|gg|p[ios]|rou|tt)'; 
$indef_A_explicit_an = "euler|hour(?!i)|heir|honest|hono"; 
$indef_A_ordinal_an = "[aefhilmnorsx]-?th"; 
$indef_A_ordinal_a = "[bcdgjkpqtuvwyz]-?th"; 

function indefinite_article($input){ 
    global $indef_A_abbrev, $indef_A_y_cons, $indef_A_explicit_an, $indef_A_ordinal_an, $indef_A_ordinal_a; 
    $word = preg_replace("^\s*(.*)\s*^", "$1", $input); 
    if(preg_match("/^[8](\d+)?/", $word)) { 
     return "an $word"; 
    } 
    if(preg_match("/^[1][1](\d+)?/", $word) || (preg_match("/^[1][8](\d+)?/", $word))) { 
     if(strlen(preg_replace(array("/\s/", "/,/", "/\.(\d+)?/"), '', $word))%3 == 2) { 
      return "an $word"; 
     } 
    } 
    if(preg_match("/^(".$indef_A_ordinal_a.")/i", $word))  return "a $word"; 
    if(preg_match("/^(".$indef_A_ordinal_an.")/i", $word))  return "an $word"; 
    if(preg_match("/^(".$indef_A_explicit_an.")/i", $word))   return "an $word"; 
    if(preg_match("/^[aefhilmnorsx]$/i", $word))  return "an $word"; 
    if(preg_match("/^[bcdgjkpqtuvwyz]$/i", $word))  return "a $word"; 
    if(preg_match("/^(".$indef_A_abbrev.")/x", $word))   return "an $word"; 
    if(preg_match("/^[aefhilmnorsx][.-]/i", $word))   return "an $word"; 
    if(preg_match("/^[a-z][.-]/i", $word))   return "a $word"; 
    if(preg_match("/^[^aeiouy]/i", $word))     return "a $word"; 
    if(preg_match("/^e[uw]/i", $word))      return "a $word"; 
    if(preg_match("/^onc?e\b/i", $word))     return "a $word"; 
    if(preg_match("/^uni([^nmd]|mo)/i", $word))  return "a $word"; 
    if(preg_match("/^ut[th]/i", $word))      return "an $word"; 
    if(preg_match("/^u[bcfhjkqrst][aeiou]/i", $word)) return "a $word"; 
    if(preg_match("/^U[NK][AIEO]?/", $word))    return "a $word"; 
    if(preg_match("/^[aeiou]/i", $word))   return "an $word"; 
    if(preg_match("/^(".$indef_A_y_cons.")/i", $word)) return "an $word"; 
    return "a $word"; 
} 

$words = array(
    "historical", 
    "hour", 
    "wholesale", 
    "administrator", 
    "inner circle" 
); 
foreach ($words as $word) { 
    echo indefinite_article($word); 
    echo "\n"; 
} 

?> 
0

He bifurcada del módulo Lucas Chavers se refiere a, limpiarlo, la fijación de una error de lógica y hacerlo integrable usando Composer; con la instalada, se puede tirar de él en su proyecto con:

php composer.phar require thaumatic/indefinite-article 

El código fuente está en https://github.com/thaumatic/indefinite-article.

Cuestiones relacionadas