I'm writing a code which splits the text with the explode function, and usually it works well. This is what it does:
There's a text with some embed questions like this one: "Hey {simple|name|What's your name?|Please write your full name}, thanks for reading!" in the middle of a paragraph, and that's interpreted in order to create contracts and stuff.
Here's an screenshot of this code working
Everything works fine until at real life users put really long texts and the explode function explodes and stop working. This is an example of this long texts:
{binary|Obligacion_EHS| ¿El contrato requiere el cumplimiento de obligaciones de Seguridad Ambiental?| Si selecciona que sí, el contrato contendrá la cláusula de obligaciones en materia ambiental| Que cumple con las disposiciones aplicables en materia de seguridad, salud y medio ambiente en el trabajo, respecto de sus trabajadores, incluyendo sin limitar los lineamientos internos que se agregan al presente Contrato como Anexo 5A, y que sus filiales y/o sus proveedores que participen en la ejecución de los Servicios Especializados también las cumplen. Derivado de lo anterior, EL CONTRATISTA deberá presentar a SIEMENS ENERGY los siguientes documentos: a. Certificado OHSAS 18001 vigente. b. El registro vigente de sus filiales y/o sus proveedores en el Padrón Público de Contratistas de Servicios Especializados u Obras Especializadas ante la Secretaría del Trabajo y Previsión Social, con sus datos correspondientes consistentes en: Números ********** y fechas ************ y que contenga los Servicios Especializados que le proporcionarán a EL CONTRATISTA. c. Cualquier documento que a satisfacción de SIEMENS ENERGY demuestre que EL CONTRATISTA cumple con el marco normativo Local y Federal en la República Mexicana de seguridad y salud en el trabajo. d. Certificado de Industria Segura - Programa de Autogestión STPS vigente. e. Acreditación reciente (1 año máximo) que EL CONTRATISTA cumple con los requerimientos en materia de seguridad, salud y medio ambiente, emitido por un auditor externo donde se valide que: i. EL CONTRATISTA da cumplimiento a los requerimientos legales aplicables en materia de seguridad, salud y medio ambiente. ii. Sus trabajadores cuentan con las competencias de seguridad adecuadas para los servicios especializados que EL CONTRATISTA presta realiza. iii. Sus trabajadores cuentan con las certificaciones de competencias laborales, las certificaciones oficiales o conforme a las leyes con las constancias de capacitación y adiestramiento necesarias para los servicios especializados que EL CONTRATISTA iv. EL CONTRATISTA cuenta con un proceso efectivo para el control del riesgo de sus actividades. En caso de incumplimiento de cualquiera de las obligaciones establecidas en el presente inciso, SIEMENS ENERGY, sin perjuicio de cualquier otro derecho contenido en el presente Contrato, podrá aplicar a EL CONTRATISTA una penalización del 10% (diez por ciento) del valor total de la Orden de Compra correspondiente.}
The idea is that I have 6 different "input types":
- Simple, which is a simple question
- Binary, which print a radio button (yes/no) question that if you press "yes" you get the policy applied if you said yes.
- Multiple, which is a select list with options.
- Monetary, which transform quantities to text amounts.
- Date, which shows a date picker.
- Repeater, which copies the value of any of the previous ones.
What I usually do is first get all the "embed" questions in the "content" into the matches variable:
// Check for variables within this template file.
preg_match_all('/{(.*)}/U', $content, $matches);
And then I create html elements with those embed questions in the matches variable like this:
// Found matches.
echo '<br><br><p><strong>New Dynamic Form Generated</strong></p>';
foreach ($matches[0] as $id => $match) {
$rep = $matches[1][$id];
$generator = explode('|', $rep);
echo '<p>'.$generator[2].' <span class="tooltip tooltip-txt" data-tooltip="'.$generator[1].'"><i class="icon-info-circled"></i></span></p>';
echo '<input type="text" class="newremplace" name="'.trim($generator[1]).'_in" id="'.trim($generator[3]).'_in" ><br>';
}
echo '<input type="button" id="reemplazar" value="Remplace"><br><br>';
But as I already mention, when I used the long long "variable embed" it just don't work,
I found this question php explode is hitting maximum size and I tried changing the memory_limit in my php.ini from 128M to 512M, and I restarted the server, but the problem remains the same.
Do you have any idea how to solve this?
UPDATE
I change the test content to this one:
CONSIDERANDO QUE, {simple| Representante1_SE | ¿Cuál es el nombre del primer Representante de SE?| Por política los contratos deben ser firmados por 2 representantes} y {simple| Representante2_SE | ¿Cuál es el nombre del Segundo Representante de SE?| Por política los contratos deben ser firmados por 2 representantes} actuando en este acto como representantes legales de SIEMENS ENERGY, tienen las facultades legales suficientes para firmar el presente Contrato, en nombre y representación de SIEMENS ENERGY, las cuales no les han sido modificadas o limitadas en forma alguna, como consta en la copia del documento integrado como Anexo 4 del presente Contrato. {binaria|Obligacion_EHS| ¿El contrato requiere el cumplimiento de obligaciones de Seguridad Ambiental?| Si selecciona que sí, el contrato contendrá la cláusula de obligaciones en materia ambiental| Que cumple con las disposiciones aplicables en materia de seguridad, salud y medio ambiente en el trabajo, respecto de sus trabajadores, incluyendo sin limitar los lineamientos internos que se agregan al presente Contrato como Anexo 5A, y que sus filiales y/o sus proveedores que participen en la ejecución de los Servicios Especializados también las cumplen. Derivado de lo anterior, EL CONTRATISTA deberá presentar a SIEMENS ENERGY los siguientes documentos: a. Certificado OHSAS 18001 vigente. b. El registro vigente de sus filiales y/o sus proveedores en el Padrón Público de Contratistas de Servicios Especializados u Obras Especializadas ante la Secretaría del Trabajo y Previsión Social, con sus datos correspondientes consistentes en: Números ********** y fechas ************ y que contenga los Servicios Especializados que le proporcionarán a EL CONTRATISTA. c. Cualquier documento que a satisfacción de SIEMENS ENERGY demuestre que EL CONTRATISTA cumple con el marco normativo Local y Federal en la República Mexicana de seguridad y salud en el trabajo. d. Certificado de Industria Segura - Programa de Autogestión STPS vigente. e. Acreditación reciente (1 año máximo) que EL CONTRATISTA cumple con los requerimientos en materia de seguridad, salud y medio ambiente, emitido por un auditor externo donde se valide que: i. EL CONTRATISTA da cumplimiento a los requerimientos legales aplicables en materia de seguridad, salud y medio ambiente. ii. Sus trabajadores cuentan con las competencias de seguridad adecuadas para los servicios especializados que EL CONTRATISTA presta realiza. iii. Sus trabajadores cuentan con las certificaciones de competencias laborales, las certificaciones oficiales o conforme a las leyes con las constancias de capacitación y adiestramiento necesarias para los servicios especializados que EL CONTRATISTA iv. EL CONTRATISTA cuenta con un proceso efectivo para el control del riesgo de sus actividades. En caso de incumplimiento de cualquiera de las obligaciones establecidas en el presente inciso, SIEMENS ENERGY, sin perjuicio de cualquier otro derecho contenido en el presente Contrato, podrá aplicar a EL CONTRATISTA una penalización del 10% (diez por ciento) del valor total de la Orden de Compra correspondiente.} CONSIDERANDO QUE, SIEMENS ENERGY requiere Contratar y recibir los Servicios Especializados (según dicho término se define más adelante) de EL CONTRATISTA, bajo los términos y condiciones estipulados en el presente Contrato. CONSIDERANDO QUE, EL CONTRATISTA es una sociedad debidamente constituida conforme a las leyes mexicanas, cuyo domicilio fiscal está ubicado en {simple| Registro_Patronal_Proveedores| ¿Cuál es el Número de Registro Patronal del Proveedor?| Es el número que otorga el IMSS a todas las Empresas para el registro de sus trabajadores}, como consta en la copia de la escritura constitutiva integrada como Anexo 4 del presente Contrato y cuenta con el Número de Registro Patronal {simple| Registro_Patronal_Proveedor| ¿Cuál es el Número de Registro Patronal del Proveedor?| Es el número que otorga el IMSS a todas las Empresas para el registro de sus trabajadores}
And this is the code that I'm using:
echo '<h3><strong>Text to process</strong></h3><pre>';
var_dump($content);
echo '</pre>';
// Check for variables within this template file.
preg_match_all('/{(.*)}/U', $content, $matches);
echo '<h3><strong>Found variables</strong></h3><pre>';
print_r($matches[0]);
echo '</pre>';
// Found matches. $matches[0] has the {}, $matches[1] doesn't have the {}
echo '<br><br><h3><strong>New Dynamic Form Generated</strong></h3><br>';
foreach ($matches[0] as $id => $match) {
$rep = $matches[1][$id];
$generator = explode('|', $rep);
echo '<pre>';
print_r($generator);
echo '</pre>';
echo '<p>'.$generator[2].' <span class="tooltip tooltip-txt" data-tooltip="'.$generator[3].'"><i class="icon-info-circled"></i></span></p>';
echo '<input type="text" class="newremplace" name="'.trim($generator[1]).'_in" id="'.trim($generator[1]).'_in" ><br>';
}
echo '<input type="button" id="reemplazar" value="Remplace"><br><br>';
// {nombre_empresa | ¿Cuál es el nombre de la empresa? | Esta, es una socia }
foreach ($matches[0] as $id => $match) {
$rep = $matches[1][$id];
$generator = explode('|', $rep);
$generator = '<span id="'.trim($generator[0]).'" class="remplace"></span>';
$content = str_replace($match, $generator, $content);
}
echo '<p><strong>Dynamic Content</strong></p><div style="width: 100%; heigth: auto; border: 1px solid #e8e8e8; padding: 15px;">';
echo $content;
echo '</div>';
So, I found out that explode is not the problem, because when I print the found variables before explode them I just have 4, instead of 5.
Array
(
[0] => {simple| Representante1_SE | ¿Cuál es el nombre del primer Representante de SE?| Por política los contratos deben ser firmados por 2 representantes}
[1] => {simple| Representante2_SE | ¿Cuál es el nombre del Segundo Representante de SE?| Por política los contratos deben ser firmados por 2 representantes}
[2] => {simple| Registro_Patronal_Proveedores| ¿Cuál es el Número de Registro Patronal del Proveedor?| Es el número que otorga el IMSS a todas las Empresas para el registro de sus trabajadores}
[3] => {simple| Registro_Patronal_Proveedor| ¿Cuál es el Número de Registro Patronal del Proveedor?| Es el número que otorga el IMSS a todas las Empresas para el registro de sus trabajadores}
)
So I guess the problem is the length that preg_match_all can handle so, I research and I found that I can change the value of pcre.backtrack_limit for 10485760, I restarted the Apache but even so, I still have the same issue, I just can see 4 of five variables.
Any ideas?
UPDATE 2. (Solved)
I finally got it! The problem was in my REGEX Function, I just added an s modifier and that solve it.
preg_match_all('/{(.*)}/sU', $content, $matches);
Thank you to everyone who helped me.