给出一个输入字符串,我需要找到并替换它:
funccall(x, y, z, w)
与此:
call(x, y, 0, z, w)
逗号之间以及逗号和方括号之间的所有内容都是未知的(即,每个输入可能不同)。其中包括x,y,z和w的值,以及它们之间的间距。
但是funccall
部分是常量(即,这是我应该寻找的实际子字符串),并且我需要在第二个逗号后插入0,
的事实也是常量。 / p>
这是我的方法:
function fix(str) {
const index0 = str.indexOf('funccall');
if (index0 >= 0) {
const index1 = str.indexOf(',', str.indexOf(',', index0) + 1);
const part0 = str.substring(0, index0);
const part1 = str.substring(index0 + 'func'.length, index1) + ', 0';
const part2 = str.substring(index1);
return part0 + part1 + part2;
}
return str;
}
我真的希望有一种单线解决方案(或者至少是一种接近单线的解决方案)。
有人对此有任何好的改进建议吗?
非常感谢您!
答案 0 :(得分:2)
如果您可以依靠参数分隔符之外不包含逗号的输入字符串,则可以改用正则表达式-匹配x, y,
部分和{{1} }部分,并将z, w
放在中间:
0,
模式由2组组成:
const fix = str => str.replace(
/(funccall\((?:[^,]+,){2})([^,]+,[^,]+\))/g,
(_, g1, g2) => `${g1} 0,${g2}`
);
console.log(fix('funccall(x, y, z, w)'));
:
(funccall\((?:[^,]+,){2})
-匹配funccall\(
后跟funccall
(
-匹配两次(除了逗号,然后是逗号)(?:[^,]+,){2})
:
([^,]+,[^,]+\))
-匹配除逗号之外的任何内容,后跟逗号([^,]+,
-后面跟逗号以外的其他任何字符(最终参数没有尾随
逗号)[^,]+
-后跟\)
答案 1 :(得分:1)
逗号之间以及逗号和方括号之间的所有内容都是未知的(即,每个输入可能不同)。
和
我真的希望有一种单线解决方案(或者至少是一种接近单线的解决方案)。
没有一个,JavaScript(我假设输入字符串是JavaScript)太复杂了。您将获得正则表达式“单线”答案。他们会错的。您需要平衡括号,大括号,方括号,单引号,双引号和反引号(至少);并且您需要处理评论(包括多行评论);等等,等等。
您需要一个JavaScript解析器。 Node.js可以使用几种可用的选项,例如@babel/parser
(Babel使用的解析器)和Esprima。
在解析器提供的树中,您将查找名称为<?php
require "fpdf/fpdf.php";
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'C:\PHPMailer\PHPMailer-master\src\Exception.php';
require 'C:\PHPMailer\PHPMailer-master\src\PHPMailer.php';
require 'C:\PHPMailer\PHPMailer-master\src\SMTP.php';
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$mail = new PHPMailer(TRUE);
try {
$mail->isHTML(true);
$mail->setFrom('example@hotmail.co.uk', 'Contact Form');
$mail->addAddress('example@hotmail.co.uk', 'eg');
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = TRUE;
$mail->SMTPSecure = 'tls';
$mail->Username = '********';
$mail->Password = '********';
$mail->Port = 587;
$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10, 'Name:');
$pdf->Ln();
$pdf->Cell(40,10, $name);
$pdf->Ln();
$pdf->Cell(40,10, 'Email:');
$pdf->Ln();
$pdf->Cell(40,10, $email);
$pdf->Ln();
$pdf->Cell(40,10, 'Their message:');
$pdf->Ln();
$pdf->Cell(40,10, $message);
$pdfdoc = $pdf->Output('', 'S');
$pdf->Ln();
if ($mail->addReplyTo($_POST['email'], $_POST['name'])) {
$mail->Subject = 'contact form';
$mail->isHTML(true);
$mail->Body = "There has been a message sent from our contact form
<br>Details can be found in the attached pdf";
$mail->addStringAttachment($pdfdoc, 'contact.pdf');
//Send the message, check for errors
if (!$mail->send()) {
//The reason for failing to send will be in $mail->ErrorInfo
$msg = 'Sorry, something went wrong. Please try again later.';
} else {
$msg = 'Message sent! Thanks for contacting us.';
header("Refresh:3; url=index.php#contact");
echo "Message sent! Thanks for contacting us. We aim to respond within 1 working day";
}
} else {
$msg = 'Invalid email address, message ignored.';
}
/* Enable SMTP debug output. */
$mail->SMTPDebug = 4;
// $mail->send();
}
catch (Exception $e)
{
echo $e->errorMessage();
}
catch (\Exception $e)
{
echo $e->getMessage();
}
?>
的函数调用。树中的节点(在一个良好的解析器中)将告诉您该调用的源文本字符串中的开始和结束位置,当然,该节点的所有各个部分都有嵌套节点。
它不会像您想象的那么复杂。